Added opportunity to initialise coloured terminal output

This commit is contained in:
Graham Nelson 2020-07-05 08:50:13 +01:00
parent f8f7986f25
commit 8a28463c18
10 changed files with 76 additions and 36 deletions

View file

@ -1,6 +1,6 @@
# Inweb 7
v7-alpha.1+1A51 'Escape to Danger' (4 July 2020)
v7-alpha.1+1A52 'Escape to Danger' (5 July 2020)
## About Inweb

View file

@ -1,3 +1,3 @@
Prerelease: alpha.1
Build Date: 4 July 2020
Build Number: 1A51
Build Date: 5 July 2020
Build Number: 1A52

View file

@ -145,6 +145,7 @@ never be used anywhere but here.
<span class="plain-syntax"> [[</span><span class="identifier-syntax">textliterals</span><span class="plain-syntax">]];</span>
<span class="plain-syntax"> </span><a href="3-tm.html#SP1" class="function-link"><span class="function-syntax">Time::begin</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="3-pth.html#SP2" class="function-link"><span class="function-syntax">Pathnames::start</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><a href="1-wp.html#SP11" class="function-link"><span class="function-syntax">Platform::enable_coloured_terminal_output</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-fm.html#SP8_2" class="named-paragraph-link"><span class="named-paragraph">Register the default debugging log aspects</span><span class="named-paragraph-number">8.2</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-fm.html#SP8_3" class="named-paragraph-link"><span class="named-paragraph">Register the default debugging log writers</span><span class="named-paragraph-number">8.3</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="1-fm.html#SP8_5" class="named-paragraph-link"><span class="named-paragraph">Register the default command line switches</span><span class="named-paragraph-number">8.5</span></a></span><span class="plain-syntax">;</span>

View file

@ -42,7 +42,7 @@
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>POSIX Platforms</b></li></ul></div>
<p class="purpose">A version of our operating system interface suitable for POSIX-compliant operating systems.</p>
<ul class="toc"><li><a href="1-pp.html#SP3">&#167;3. Mac OS X</a></li><li><a href="1-pp.html#SP4">&#167;4. Generic Unix</a></li><li><a href="1-pp.html#SP5">&#167;5. Linux</a></li><li><a href="1-pp.html#SP6">&#167;6. Android</a></li><li><a href="1-pp.html#SP7">&#167;7. Locale</a></li><li><a href="1-pp.html#SP8">&#167;8. Environment variables</a></li><li><a href="1-pp.html#SP9">&#167;9. Executable location</a></li><li><a href="1-pp.html#SP10">&#167;10. Shell commands</a></li><li><a href="1-pp.html#SP12">&#167;12. Directory handling</a></li><li><a href="1-pp.html#SP13">&#167;13. Timestamp and file size</a></li><li><a href="1-pp.html#SP14">&#167;14. Sync</a></li><li><a href="1-pp.html#SP15">&#167;15. Sleep</a></li><li><a href="1-pp.html#SP16">&#167;16. Notifications</a></li><li><a href="1-pp.html#SP18">&#167;18. Concurrency</a></li><li><a href="1-pp.html#SP20">&#167;20. Mutexes</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-pp.html#SP3">&#167;3. Mac OS X</a></li><li><a href="1-pp.html#SP4">&#167;4. Generic Unix</a></li><li><a href="1-pp.html#SP5">&#167;5. Linux</a></li><li><a href="1-pp.html#SP6">&#167;6. Android</a></li><li><a href="1-pp.html#SP7">&#167;7. Locale</a></li><li><a href="1-pp.html#SP8">&#167;8. Environment variables</a></li><li><a href="1-pp.html#SP9">&#167;9. Executable location</a></li><li><a href="1-pp.html#SP10">&#167;10. Shell commands</a></li><li><a href="1-pp.html#SP12">&#167;12. Directory handling</a></li><li><a href="1-pp.html#SP13">&#167;13. Timestamp and file size</a></li><li><a href="1-pp.html#SP14">&#167;14. Sync</a></li><li><a href="1-pp.html#SP15">&#167;15. Sleep</a></li><li><a href="1-pp.html#SP16">&#167;16. Notifications</a></li><li><a href="1-pp.html#SP18">&#167;18. Coloured terminal output</a></li><li><a href="1-pp.html#SP19">&#167;19. Concurrency</a></li><li><a href="1-pp.html#SP21">&#167;21. Mutexes</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>The C standard library leaves many questions unanswered about how to deal
with the host operating system: for example, it knows very little about
@ -337,23 +337,23 @@ be dealing with.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">time_t</span><span class="plain-syntax">) </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::timestamp</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::timestamp</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stat</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stat</span><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">filestat</span><span class="plain-syntax">) != -1) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">.</span><span class="identifier-syntax">st_mtime</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">off_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::size</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">off_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::size</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stat</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stat</span><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">filestat</span><span class="plain-syntax">) != -1) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">.</span><span class="identifier-syntax">st_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">off_t</span><span class="plain-syntax">) </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li><li>The function Platform::never_time is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>).</li><li>The function Platform::timestamp is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>), Filenames (<a href="3-fln.html#SP12">&#167;12</a>).</li><li>The function Platform::size is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>), Filenames (<a href="3-fln.html#SP12">&#167;12</a>).</li></ul>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li><li>The function Platform::never_time is used in Windows Platform (<a href="1-wp.html#SP14">&#167;14</a>).</li><li>The function Platform::timestamp is used in Windows Platform (<a href="1-wp.html#SP14">&#167;14</a>), Filenames (<a href="3-fln.html#SP12">&#167;12</a>).</li><li>The function Platform::size is used in Windows Platform (<a href="1-wp.html#SP14">&#167;14</a>), Filenames (<a href="3-fln.html#SP12">&#167;12</a>).</li></ul>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. Sync. </b>Both names here are of directories which do exist. The function makes
the <span class="extract"><span class="extract-syntax">dest</span></span> tree an exact copy of the <span class="extract"><span class="extract-syntax">source</span></span> tree (and therefore deletes
anything different which was originally in <span class="extract"><span class="extract-syntax">dest</span></span>).
@ -425,38 +425,48 @@ actually running a one-line AppleScript here.
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined and if PLATFORM_MACOS is undefined.</li><li>The function Platform::notification is used in <a href="1-pp.html#SP16">&#167;16</a>, Windows Platform (<a href="1-wp.html#SP10">&#167;10</a>).</li></ul>
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. Concurrency. </b></p>
<p class="commentary firstcommentary"><a id="SP18"></a><b>&#167;18. Coloured terminal output. </b>The idea of this function is that if anything needs to be done to enable the
output of ANSI-standard coloured terminal output, then this function has the
chance to do it. On POSIX platforms, so far as we know, nothing need be done.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><a href="1-wp.html#SP11" class="function-link"><span class="function-syntax">Platform::enable_coloured_terminal_output</span></a><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li><li>The function Platform::enable_coloured_terminal_output is used in Foundation Module (<a href="1-fm.html#SP8">&#167;8</a>), Windows Platform (<a href="1-wp.html#SP11">&#167;11</a>).</li></ul>
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. Concurrency. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="identifier-syntax">pthread_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="identifier-syntax">pthread_attr_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax">;</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP19"></a><b>&#167;19. </b></p>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><a href="1-wp.html#SP12" class="function-link"><span class="function-syntax">Platform::create_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::create_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *(*</span><span class="identifier-syntax">fn</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *), </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pthread_create</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">, </span><span class="identifier-syntax">arg</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><a href="1-wp.html#SP12" class="function-link"><span class="function-syntax">Platform::join_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax">** </span><span class="identifier-syntax">rv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::join_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax">** </span><span class="identifier-syntax">rv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">pthread_join</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">rv</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><a href="1-wp.html#SP12" class="function-link"><span class="function-syntax">Platform::init_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::init_thread</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pthread_attr_init</span><span class="plain-syntax">(</span><span class="identifier-syntax">pa</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"thread initialisation failed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">pthread_attr_setstacksize</span><span class="plain-syntax">(</span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">size</span><span class="plain-syntax">) != </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"thread stack sizing failed"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP12" class="function-link"><span class="function-syntax">Platform::get_thread_stack_size</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::get_thread_stack_size</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">mystacksize</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">pthread_attr_getstacksize</span><span class="plain-syntax">(</span><span class="identifier-syntax">pa</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">mystacksize</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">mystacksize</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li><li>The function Platform::create_thread is used in Windows Platform (<a href="1-wp.html#SP12">&#167;12</a>).</li><li>The function Platform::join_thread is used in Windows Platform (<a href="1-wp.html#SP12">&#167;12</a>).</li><li>The function Platform::init_thread is used in Windows Platform (<a href="1-wp.html#SP12">&#167;12</a>).</li><li>The function Platform::get_thread_stack_size is used in Windows Platform (<a href="1-wp.html#SP12">&#167;12</a>).</li></ul>
<p class="commentary firstcommentary"><a id="SP20"></a><b>&#167;20. Mutexes. </b></p>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_POSIX is defined.</li><li>The function Platform::create_thread is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>).</li><li>The function Platform::join_thread is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>).</li><li>The function Platform::init_thread is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>).</li><li>The function Platform::get_thread_stack_size is used in Windows Platform (<a href="1-wp.html#SP13">&#167;13</a>).</li></ul>
<p class="commentary firstcommentary"><a id="SP21"></a><b>&#167;21. Mutexes. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">CREATE_MUTEX</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">static</span><span class="plain-syntax"> </span><span class="identifier-syntax">pthread_mutex_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax"> = </span><span class="identifier-syntax">PTHREAD_MUTEX_INITIALIZER</span><span class="plain-syntax">;</span>

View file

@ -50,7 +50,7 @@ function togglePopup(material_id) {
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#1">Chapter 1: Setting Up</a></li><li><b>Windows Platform</b></li></ul></div>
<p class="purpose">A version of our operating system interface suitable for Microsoft Windows.</p>
<ul class="toc"><li><a href="1-wp.html#SP2">&#167;2. Microsoft Windows</a></li><li><a href="1-wp.html#SP4">&#167;4. Environment variables</a></li><li><a href="1-wp.html#SP5">&#167;5. Executable location</a></li><li><a href="1-wp.html#SP6">&#167;6. Shell commands</a></li><li><a href="1-wp.html#SP7">&#167;7. Directory handling</a></li><li><a href="1-wp.html#SP8">&#167;8. Sync</a></li><li><a href="1-wp.html#SP9">&#167;9. Sleep</a></li><li><a href="1-wp.html#SP10">&#167;10. Notifications</a></li><li><a href="1-wp.html#SP11">&#167;11. Concurrency</a></li><li><a href="1-wp.html#SP13">&#167;13. Timestamp and file size</a></li><li><a href="1-wp.html#SP14">&#167;14. Mutexes</a></li></ul><hr class="tocbar">
<ul class="toc"><li><a href="1-wp.html#SP2">&#167;2. Microsoft Windows</a></li><li><a href="1-wp.html#SP4">&#167;4. Environment variables</a></li><li><a href="1-wp.html#SP5">&#167;5. Executable location</a></li><li><a href="1-wp.html#SP6">&#167;6. Shell commands</a></li><li><a href="1-wp.html#SP7">&#167;7. Directory handling</a></li><li><a href="1-wp.html#SP8">&#167;8. Sync</a></li><li><a href="1-wp.html#SP9">&#167;9. Sleep</a></li><li><a href="1-wp.html#SP10">&#167;10. Notifications</a></li><li><a href="1-wp.html#SP11">&#167;11. Coloured terminal output</a></li><li><a href="1-wp.html#SP12">&#167;12. Concurrency</a></li><li><a href="1-wp.html#SP14">&#167;14. Timestamp and file size</a></li><li><a href="1-wp.html#SP15">&#167;15. Mutexes</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1"></a><b>&#167;1. </b>This Foundation module comes with two variant versions of the <span class="extract"><span class="extract-syntax">Platform::</span></span>
section of code. The one you're reading compiles on Windows, and the other
@ -69,10 +69,10 @@ on a POSIX operating system.
<span class="definition-keyword">define</span> <span class="constant-syntax">HTML_MAP_FONT_SIZE</span><span class="plain-syntax"> </span><span class="constant-syntax">11</span>
</pre>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;sys/stat.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;dirent.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;errno.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;io.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;sys/stat.h&gt;</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">define</span><span class="plain-syntax"> </span><span class="identifier-syntax">WIN32_LEAN_AND_MEAN</span>
<span class="plain-syntax">#</span><span class="identifier-syntax">include</span><span class="plain-syntax"> </span><span class="function-syntax">&lt;windows.h&gt;</span>
@ -145,8 +145,8 @@ just that installation and use of Foundation-built tools is less convenient.)
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::system</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">Platform::system</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP10">&#167;10</a>, <a href="1-pp.html#SP11">&#167;11</a>, <a href="1-pp.html#SP14">&#167;14</a><br/>Shell - <a href="3-shl.html#SP5">&#167;5</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cmd</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> </span><span class="identifier-syntax">cmdline</span><span class="plain-syntax">[4096];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sprintf</span><span class="plain-syntax">(</span><span class="identifier-syntax">cmdline</span><span class="plain-syntax">,</span><span class="string-syntax">"cmd /s /c \"%s\""</span><span class="plain-syntax">, </span><span class="identifier-syntax">cmd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> </span><span class="identifier-syntax">cmd_line</span><span class="plain-syntax">[10*</span><span class="identifier-syntax">MAX_PATH</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">sprintf</span><span class="plain-syntax">(</span><span class="identifier-syntax">cmd_line</span><span class="plain-syntax">, </span><span class="string-syntax">"sh -c %s"</span><span class="plain-syntax">, </span><span class="identifier-syntax">cmd</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">STARTUPINFOA</span><span class="plain-syntax"> </span><span class="identifier-syntax">start</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">memset</span><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">start</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax"> </span><span class="identifier-syntax">start</span><span class="plain-syntax">);</span>
@ -155,7 +155,7 @@ just that installation and use of Foundation-built tools is less convenient.)
<span class="plain-syntax"> </span><span class="identifier-syntax">start</span><span class="plain-syntax">.</span><span class="identifier-syntax">wShowWindow</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SW_HIDE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">PROCESS_INFORMATION</span><span class="plain-syntax"> </span><span class="identifier-syntax">process</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CreateProcessA</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">cmdline</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">CREATE_NO_WINDOW</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">start</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">process</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">CreateProcessA</span><span class="plain-syntax">(0, </span><span class="identifier-syntax">cmd_line</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">, </span><span class="identifier-syntax">CREATE_NO_WINDOW</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">start</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">process</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">CloseHandle</span><span class="plain-syntax">(</span><span class="identifier-syntax">process</span><span class="plain-syntax">.</span><span class="identifier-syntax">hThread</span><span class="plain-syntax">);</span>
@ -236,7 +236,17 @@ POSIX <span class="extract"><span class="extract-syntax">sleep</span></span> is
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_WINDOWS is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. Concurrency. </b></p>
<p class="commentary firstcommentary"><a id="SP11"></a><b>&#167;11. Coloured terminal output. </b>The idea of this function is that if anything needs to be done to enable the
output of ANSI-standard coloured terminal output, then this function has the
chance to do it.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::enable_coloured_terminal_output</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Platform::enable_coloured_terminal_output</span></span>:<br/>Foundation Module - <a href="1-fm.html#SP8">&#167;8</a><br/>POSIX Platforms - <a href="1-pp.html#SP18">&#167;18</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_WINDOWS is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. Concurrency. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="identifier-syntax">HANDLE</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax">;</span>
@ -245,7 +255,7 @@ POSIX <span class="extract"><span class="extract-syntax">sleep</span></span> is
<span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">Win32_Thread_Start</span><span class="plain-syntax"> { </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *(*</span><span class="identifier-syntax">fn</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *); </span><span class="reserved-syntax">void</span><span class="plain-syntax">* </span><span class="identifier-syntax">arg</span><span class="plain-syntax">; };</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_WINDOWS is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP12"></a><b>&#167;12. </b></p>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">DWORD</span><span class="plain-syntax"> </span><span class="identifier-syntax">WINAPI</span><span class="plain-syntax"> </span><span class="identifier-syntax">Platform::Win32_Thread_Func</span><span class="plain-syntax">(</span><span class="identifier-syntax">LPVOID</span><span class="plain-syntax"> </span><span class="identifier-syntax">param</span><span class="plain-syntax">) {</span>
@ -255,7 +265,7 @@ POSIX <span class="extract"><span class="extract-syntax">sleep</span></span> is
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::create_thread</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">Platform::create_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">,</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::create_thread</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Platform::create_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">const</span><span class="plain-syntax"> </span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pa</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *(*</span><span class="identifier-syntax">fn</span><span class="plain-syntax">)(</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *), </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">arg</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">Win32_Thread_Start</span><span class="plain-syntax">* </span><span class="identifier-syntax">start</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">Win32_Thread_Start</span><span class="plain-syntax">*) </span><span class="identifier-syntax">malloc</span><span class="plain-syntax">(</span><span class="reserved-syntax">sizeof</span><span class="plain-syntax"> (</span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">Win32_Thread_Start</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">start</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fn</span><span class="plain-syntax">;</span>
@ -270,19 +280,19 @@ POSIX <span class="extract"><span class="extract-syntax">sleep</span></span> is
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::join_thread</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">Platform::join_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax">** </span><span class="identifier-syntax">rv</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::join_thread</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Platform::join_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread</span><span class="plain-syntax"> </span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax">** </span><span class="identifier-syntax">rv</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">WaitForSingleObject</span><span class="plain-syntax">(</span><span class="identifier-syntax">pt</span><span class="plain-syntax">, </span><span class="identifier-syntax">INFINITE</span><span class="plain-syntax">) == </span><span class="identifier-syntax">WAIT_OBJECT_0</span><span class="plain-syntax">) ? </span><span class="constant-syntax">0</span><span class="plain-syntax"> : </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::init_thread</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">Platform::init_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax">* </span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::init_thread</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Platform::init_thread</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax">* </span><span class="identifier-syntax">pa</span><span class="plain-syntax">, </span><span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">) {</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::get_thread_stack_size</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">Platform::get_thread_stack_size</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP19">&#167;19</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax">* </span><span class="identifier-syntax">pa</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">size_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::get_thread_stack_size</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Platform::get_thread_stack_size</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP20">&#167;20</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">foundation_thread_attributes</span><span class="plain-syntax">* </span><span class="identifier-syntax">pa</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_WINDOWS is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP13"></a><b>&#167;13. Timestamp and file size. </b>There are implementations of the C standard library where <span class="extract"><span class="extract-syntax">time_t</span></span> has
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. Timestamp and file size. </b>There are implementations of the C standard library where <span class="extract"><span class="extract-syntax">time_t</span></span> has
super-weird behaviour, but on almost all POSIX systems, time 0 corresponds to
midnight on 1 January 1970. All we really need is that the "never" value
is one which is earlier than any possible timestamp on the files we'll
@ -290,24 +300,24 @@ be dealing with.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::never_time</span><button class="popup" onclick="togglePopup('usagePopup15')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup15">Usage of <span class="code-font"><span class="function-syntax">Platform::never_time</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::never_time</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Platform::never_time</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">void</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">time_t</span><span class="plain-syntax">) </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::timestamp</span><button class="popup" onclick="togglePopup('usagePopup16')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup16">Usage of <span class="code-font"><span class="function-syntax">Platform::timestamp</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a><br/>Filenames - <a href="3-fln.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::timestamp</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Platform::timestamp</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a><br/>Filenames - <a href="3-fln.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stat</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stat</span><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">filestat</span><span class="plain-syntax">) != -1) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">.</span><span class="identifier-syntax">st_mtime</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::never_time</span></a><span class="plain-syntax">();</span>
<span class="plain-syntax">}</span>
<span class="identifier-syntax">off_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::size</span><button class="popup" onclick="togglePopup('usagePopup17')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup17">Usage of <span class="code-font"><span class="function-syntax">Platform::size</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a><br/>Filenames - <a href="3-fln.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="identifier-syntax">off_t</span><span class="plain-syntax"> </span><span class="function-syntax">Platform::size</span><button class="popup" onclick="togglePopup('usagePopup18')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup18">Usage of <span class="code-font"><span class="function-syntax">Platform::size</span></span>:<br/>POSIX Platforms - <a href="1-pp.html#SP13">&#167;13</a><br/>Filenames - <a href="3-fln.html#SP12">&#167;12</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">stat</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">stat</span><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_filename</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">filestat</span><span class="plain-syntax">) != -1) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">filestat</span><span class="plain-syntax">.</span><span class="identifier-syntax">st_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">off_t</span><span class="plain-syntax">) </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<ul class="endnotetexts"><li>This paragraph is used only if PLATFORM_WINDOWS is defined.</li></ul>
<p class="commentary firstcommentary"><a id="SP14"></a><b>&#167;14. Mutexes. </b></p>
<p class="commentary firstcommentary"><a id="SP15"></a><b>&#167;15. Mutexes. </b></p>
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">CREATE_MUTEX</span><span class="plain-syntax">(</span><span class="identifier-syntax">name</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">static</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">Win32_Mutex</span><span class="plain-syntax"> </span><span class="identifier-syntax">name</span><span class="plain-syntax"> = { </span><span class="identifier-syntax">INIT_ONCE_STATIC_INIT</span><span class="plain-syntax">, { </span><span class="constant-syntax">0</span><span class="plain-syntax"> }};</span>

View file

@ -320,7 +320,7 @@ when printed out.
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">, </span><span class="string-syntax">"%f"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-sm.html#SP6" class="function-link"><span class="function-syntax">Str::copy_to_locale_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">, </span><span class="identifier-syntax">FN</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">*</span><span class="constant-syntax">MAX_FILENAME_LENGTH</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::timestamp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">time_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::timestamp</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
@ -330,7 +330,7 @@ when printed out.
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">, </span><span class="string-syntax">"%f"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="4-sm.html#SP6" class="function-link"><span class="function-syntax">Str::copy_to_locale_string</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">, </span><span class="identifier-syntax">FN</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">*</span><span class="constant-syntax">MAX_FILENAME_LENGTH</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="1-wp.html#SP13" class="function-link"><span class="function-syntax">Platform::size</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><a href="1-wp.html#SP14" class="function-link"><span class="function-syntax">Platform::size</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">transcoded_pathname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">DISCARD_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">FN</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">t</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>

Binary file not shown.

View file

@ -92,6 +92,7 @@ void Foundation::start(void) {
[[textliterals]];
Time::begin();
Pathnames::start();
Platform::enable_coloured_terminal_output();
@<Register the default debugging log aspects@>;
@<Register the default debugging log writers@>;
@<Register the default command line switches@>;

View file

@ -340,6 +340,15 @@ void Platform::notification(text_stream *text, int happy) {
void Platform::notification(text_stream *text, int happy) {
}
@h Coloured terminal output.
The idea of this function is that if anything needs to be done to enable the
output of ANSI-standard coloured terminal output, then this function has the
chance to do it. On POSIX platforms, so far as we know, nothing need be done.
=
void Platform::enable_coloured_terminal_output(void) {
}
@h Concurrency.
= (very early code)

View file

@ -171,6 +171,15 @@ void Platform::sleep(int seconds) {
void Platform::notification(text_stream *text, int happy) {
}
@h Coloured terminal output.
The idea of this function is that if anything needs to be done to enable the
output of ANSI-standard coloured terminal output, then this function has the
chance to do it.
=
void Platform::enable_coloured_terminal_output(void) {
}
@h Concurrency.
= (very early code)