|
|
|
@ -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#2">Chapter 2: Memory, Streams and Collections</a></li><li><b>Writers and Loggers</b></li></ul></div>
|
|
|
|
|
<p class="purpose">Formatted text output to streams.</p>
|
|
|
|
|
|
|
|
|
|
<ul class="toc"><li><a href="2-wal.html#SP1">§1. Registration</a></li><li><a href="2-wal.html#SP6">§6. Writing</a></li></ul><hr class="tocbar">
|
|
|
|
|
<ul class="toc"><li><a href="2-wal.html#SP1">§1. Registration</a></li><li><a href="2-wal.html#SP6">§6. Writing</a></li><li><a href="2-wal.html#SP7">§7. Abbreviation macros</a></li></ul><hr class="tocbar">
|
|
|
|
|
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>§1. Registration. </b>The main function here is modelled on the "minimum <span class="extract"><span class="extract-syntax">printf</span></span>" function
|
|
|
|
|
used as an example in Kernighan and Ritchie, Chapter 7, but because it
|
|
|
|
@ -123,13 +123,13 @@ because the loggers don't use format strings.)
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Writers::register_writer</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">Writers::register_writer</span></span>:<br/>Foundation Module - <a href="1-fm.html#SP8_1">§8.1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="2-wal.html#SP5" class="function-link"><span class="function-syntax">Writers::register_writer_p</span></a><span class="plain-syntax">(0, </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="constant-syntax">POINTER_ECAT</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">Writers::register_logger</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Writers::register_logger</span></span>:<br/>Foundation Module - <a href="1-fm.html#SP8_3">§8.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</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="function-syntax">Writers::register_logger</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">Writers::register_logger</span></span>:<br/><a href="2-wal.html#SP7">§7</a><br/>Foundation Module - <a href="1-fm.html#SP8_3">§8.3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="2-wal.html#SP5" class="function-link"><span class="function-syntax">Writers::register_writer_p</span></a><span class="plain-syntax">(1, </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="constant-syntax">POINTER_ECAT</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">Writers::register_writer_I</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="2-wal.html#SP5" class="function-link"><span class="function-syntax">Writers::register_writer_p</span></a><span class="plain-syntax">(0, </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="constant-syntax">INTSIZED_ECAT</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">Writers::register_logger_I</span><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Writers::register_logger_I</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">Writers::register_logger_I</span></span>:<br/><a href="2-wal.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">f</span><span class="plain-syntax">)(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *, </span><span class="reserved-syntax">int</span><span class="plain-syntax">)) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><a href="2-wal.html#SP5" class="function-link"><span class="function-syntax">Writers::register_writer_p</span></a><span class="plain-syntax">(1, </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, (</span><span class="reserved-syntax">void</span><span class="plain-syntax"> *) </span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="constant-syntax">INTSIZED_ECAT</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="plain-syntax">}</span>
|
|
|
|
|
<span class="plain-syntax">#</span><span class="identifier-syntax">ifdef</span><span class="plain-syntax"> </span><span class="identifier-syntax">WORDS_MODULE</span>
|
|
|
|
@ -141,7 +141,7 @@ because the loggers don't use format strings.)
|
|
|
|
|
</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">Writers::register_writer_p</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">Writers::register_writer_p</span></span>:<br/><a href="2-wal.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</span><span class="plain-syntax">) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Writers::register_writer_p</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Writers::register_writer_p</span></span>:<br/><a href="2-wal.html#SP4">§4</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">set</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">esc</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">f</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cat</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">escapes_registered</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><span class="named-paragraph-container code-font"><a href="2-wal.html#SP5_1" class="named-paragraph-link"><span class="named-paragraph">Initialise the table of escapes</span><span class="named-paragraph-number">5.1</span></a></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">esc</span><span class="plain-syntax"> < </span><span class="constant-syntax">0</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">esc</span><span class="plain-syntax"> >= </span><span class="constant-syntax">128</span><span class="plain-syntax">) ||</span>
|
|
|
|
|
<span class="plain-syntax"> ((</span><a href="4-chr.html#SP1" class="function-link"><span class="function-syntax">Characters::isalpha</span></a><span class="plain-syntax">((</span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax">) </span><span class="identifier-syntax">esc</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) &&</span>
|
|
|
|
@ -190,7 +190,7 @@ waiting for:
|
|
|
|
|
</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">Writers::printf</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">Writers::printf</span></span>:<br/>Streams - <a href="2-str.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stream</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fmt</span><span class="plain-syntax">, ...) {</span>
|
|
|
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Writers::printf</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">Writers::printf</span></span>:<br/>Streams - <a href="2-str.html#SP3">§3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">stream</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fmt</span><span class="plain-syntax">, ...) {</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">va_list</span><span class="plain-syntax"> </span><span class="identifier-syntax">ap</span><span class="plain-syntax">; </span><span class="comment-syntax"> the variable argument list signified by the dots</span>
|
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">p</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">stream</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
|
|
|
|
@ -337,6 +337,16 @@ file encodings, but expanding <span class="extract"><span class="extract-syntax"
|
|
|
|
|
<span class="plain-syntax"> #</span><span class="identifier-syntax">pragma</span><span class="plain-syntax"> </span><span class="identifier-syntax">clang</span><span class="plain-syntax"> </span><span class="identifier-syntax">diagnostic</span><span class="plain-syntax"> </span><span class="identifier-syntax">pop</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<ul class="endnotetexts"><li>This code is used in <a href="2-wal.html#SP6_1">§6.1</a>.</li></ul>
|
|
|
|
|
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>§7. Abbreviation macros. </b>The following proved convenient for Inform, at any rate.
|
|
|
|
|
</p>
|
|
|
|
|
|
|
|
|
|
<pre class="definitions code-font"><span class="definition-keyword">define</span> <span class="identifier-syntax">REGISTER_WRITER</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">f</span><span class="plain-syntax">) </span><a href="2-wal.html#SP4" class="function-link"><span class="function-syntax">Writers::register_logger</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, &</span><span class="identifier-syntax">f</span><span class="plain-syntax">##</span><span class="identifier-syntax">_writer</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="definition-keyword">define</span> <span class="identifier-syntax">COMPILE_WRITER</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">f</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">f</span><span class="plain-syntax">##</span><span class="identifier-syntax">_writer</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="reserved-syntax">void</span><span class="plain-syntax"> *</span><span class="identifier-syntax">obj</span><span class="plain-syntax">) { </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SDL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DL</span><span class="plain-syntax">; </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">format</span><span class="plain-syntax">; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">DL</span><span class="plain-syntax">) </span><span class="identifier-syntax">f</span><span class="plain-syntax">((</span><span class="identifier-syntax">t</span><span class="plain-syntax">) </span><span class="identifier-syntax">obj</span><span class="plain-syntax">); </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SDL</span><span class="plain-syntax">; }</span>
|
|
|
|
|
<span class="definition-keyword">define</span> <span class="identifier-syntax">REGISTER_WRITER_I</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">f</span><span class="plain-syntax">) </span><a href="2-wal.html#SP4" class="function-link"><span class="function-syntax">Writers::register_logger_I</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, &</span><span class="identifier-syntax">f</span><span class="plain-syntax">##</span><span class="identifier-syntax">_writer</span><span class="plain-syntax">);</span>
|
|
|
|
|
<span class="definition-keyword">define</span> <span class="identifier-syntax">COMPILE_WRITER_I</span><span class="plain-syntax">(</span><span class="identifier-syntax">t</span><span class="plain-syntax">, </span><span class="identifier-syntax">f</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">f</span><span class="plain-syntax">##</span><span class="identifier-syntax">_writer</span><span class="plain-syntax">(</span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">format</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">I</span><span class="plain-syntax">) { </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">SDL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">DL</span><span class="plain-syntax">; </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">format</span><span class="plain-syntax">; </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">DL</span><span class="plain-syntax">) </span><span class="identifier-syntax">f</span><span class="plain-syntax">((</span><span class="identifier-syntax">t</span><span class="plain-syntax">) </span><span class="identifier-syntax">I</span><span class="plain-syntax">); </span><span class="identifier-syntax">DL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">SDL</span><span class="plain-syntax">; }</span>
|
|
|
|
|
</pre>
|
|
|
|
|
<nav role="progress"><div class="progresscontainer">
|
|
|
|
|
<ul class="progressbar"><li class="progressprev"><a href="2-str.html">❮</a></li><li class="progresschapter"><a href="P-abgtf.html">P</a></li><li class="progresschapter"><a href="1-fm.html">1</a></li><li class="progresscurrentchapter">2</li><li class="progresssection"><a href="2-dl.html">dl</a></li><li class="progresssection"><a href="2-mmr.html">mmr</a></li><li class="progresssection"><a href="2-fc.html">fc</a></li><li class="progresssection"><a href="2-lcl.html">lcl</a></li><li class="progresssection"><a href="2-str.html">str</a></li><li class="progresscurrent">wal</li><li class="progresssection"><a href="2-mth.html">mth</a></li><li class="progresssection"><a href="2-llas.html">llas</a></li><li class="progresssection"><a href="2-dct.html">dct</a></li><li class="progresssection"><a href="2-trs.html">trs</a></li><li class="progresschapter"><a href="3-em.html">3</a></li><li class="progresschapter"><a href="4-chr.html">4</a></li><li class="progresschapter"><a href="5-htm.html">5</a></li><li class="progresschapter"><a href="6-bf.html">6</a></li><li class="progresschapter"><a href="7-vn.html">7</a></li><li class="progresschapter"><a href="8-ws.html">8</a></li><li class="progressnext"><a href="2-mth.html">❯</a></li></ul></div>
|
|
|
|
|
</nav><!--End of weave-->
|
|
|
|
|