334 lines
63 KiB
HTML
334 lines
63 KiB
HTML
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
|
|
<html>
|
|
<head>
|
|
<title>The Tangler</title>
|
|
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<meta name="viewport" content="width=device-width initial-scale=1">
|
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
|
<meta http-equiv="Content-Language" content="en-gb">
|
|
|
|
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<script>
|
|
function togglePopup(material_id) {
|
|
var popup = document.getElementById(material_id);
|
|
popup.classList.toggle("show");
|
|
}
|
|
</script>
|
|
|
|
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
|
|
|
|
</head>
|
|
<body>
|
|
<nav role="navigation">
|
|
<h1><a href="../index.html">
|
|
<img src="../docs-assets/Octagram.png" width=72 height=72">
|
|
</a></h1>
|
|
<ul><li><a href="index.html"><span class="selectedlink">inweb</span></a></li>
|
|
</ul><h2>Foundation Module</h2><ul>
|
|
<li><a href="../foundation-module/index.html">foundation</a></li>
|
|
<li><a href="../foundation-test/index.html">foundation-test</a></li>
|
|
</ul><h2>Example Webs</h2><ul>
|
|
<li><a href="../goldbach/index.html">goldbach</a></li>
|
|
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
|
|
<li><a href="../eastertide/index.html">eastertide</a></li>
|
|
</ul><h2>Repository</h2><ul>
|
|
<li><a href="https://github.com/ganelson/inweb"><img src="../docs-assets/github.png" height=18> github</a></li>
|
|
</ul><h2>Related Projects</h2><ul>
|
|
<li><a href="../../../inform/docs/index.html">inform</a></li>
|
|
<li><a href="../../../intest/docs/index.html">intest</a></li>
|
|
|
|
</ul>
|
|
</nav>
|
|
<main role="main">
|
|
|
|
<!--Weave of 'The Tangler' generated by Inweb-->
|
|
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#3">Chapter 3: Outputs</a></li><li><b>The Tangler</b></li></ul><p class="purpose">To transcribe a version of the text in the web into a form which can be compiled as a program.</p>
|
|
|
|
<ul class="toc"><li><a href="3-tt.html#SP1">§1. The Master Tangler</a></li><li><a href="3-tt.html#SP3">§3. The Code Tangler</a></li><li><a href="3-tt.html#SP4">§4. Prinary target</a></li></ul><hr class="tocbar">
|
|
|
|
<p class="inwebparagraph"><a id="SP1"></a><b>§1. The Master Tangler. </b>Here's what has happened so far, on a <code class="display"><span class="extract-syntax">-tangle</span></code> run of Inweb: on any
|
|
other sort of run, of course, we would never be in this section of code.
|
|
The web was read completely into memory, and then fully parsed, with all
|
|
of the arrays and hashes populated. Program Control then sent us straight
|
|
here for the tangling to begin...
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Tangler::tangle</span><button class="popup" onclick="togglePopup('usagePopup1')">...<span class="popuptext" id="usagePopup1">Usage of <b>Tangler::tangle</b>:<br>Program Control - <a href="1-pc.html#SP7_4_2">§7.4.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="reserved-syntax">tangle_target</span><span class="plain-syntax"> *</span><span class="identifier-syntax">target</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">dest_file</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lang</span><span class="plain-syntax"> = </span><span class="identifier-syntax">target</span><span class="plain-syntax">-></span><span class="element-syntax">tangle_language</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">PRINT</span><span class="plain-syntax">(</span><span class="string-syntax">" tangling <%/f> (written in %S)\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">dest_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">-></span><span class="element-syntax">language_name</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> </span><span class="identifier-syntax">TO_struct</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">OUT</span><span class="plain-syntax"> = &</span><span class="identifier-syntax">TO_struct</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_OPEN_TO_FILE</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">dest_file</span><span class="plain-syntax">, </span><span class="constant-syntax">ISO_ENC</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/3-em.html#SP2" class="internal">Errors::fatal_with_file</a><span class="plain-syntax">(</span><span class="string-syntax">"unable to write tangled file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">dest_file</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Perform the actual tangle</span> <span class="named-paragraph-number">1.1</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">STREAM_CLOSE</span><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Tangle any imported headers</span> <span class="named-paragraph-number">1.2</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP21" class="internal">LanguageMethods::additional_tangling</a><span class="plain-syntax">(</span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre><p class="inwebparagraph"><a id="SP1_1"></a><b>§1.1. </b>All of the sections are tangled together into one big file, the structure
|
|
of which can be seen below.
|
|
</p>
|
|
|
|
|
|
<pre class="definitions">
|
|
<span class="definition-keyword">define</span> <span class="identifier-syntax">LOOP_OVER_PARAGRAPHS</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">T</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="reserved-syntax">chapter</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">chapters</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">section</span><span class="plain-syntax">, </span><span class="identifier-syntax">C</span><span class="plain-syntax">-></span><span class="element-syntax">sections</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">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_target</span><span class="plain-syntax"> == </span><span class="identifier-syntax">T</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">, </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">paragraphs</span><span class="plain-syntax">)</span>
|
|
</pre>
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="named-paragraph-defn">Perform the actual tangle</span> <span class="named-paragraph-number">1.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="comment"> (a) The shebang line, a header for scripting languages, and other heading matter</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP7" class="internal">LanguageMethods::shebang</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP8" class="internal">LanguageMethods::disclaimer</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP9" class="internal">LanguageMethods::additional_early_matter</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">chapter</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">; </span><span class="reserved-syntax">section</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">; </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_PARAGRAPHS</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</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">P</span><span class="plain-syntax">-></span><span class="element-syntax">placed_very_early</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">defines_macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP2" class="internal">Tangler::tangle_paragraph</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="comment"> (b) Results of </span><code class="display"><span class="extract-syntax">@d</span></code><span class="comment"> declarations</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Tangle all the constant definitions in section order</span> <span class="named-paragraph-number">1.1.1</span>><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="comment"> (c) Miscellaneous automated C predeclarations</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP11" class="internal">LanguageMethods::additional_predeclarations</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="comment"> (d) Above-the-bar code from all of the sections (global variables, and such)</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_PARAGRAPHS</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</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">P</span><span class="plain-syntax">-></span><span class="element-syntax">placed_early</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">defines_macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP2" class="internal">Tangler::tangle_paragraph</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="comment"> (e) Below-the-bar code: the bulk of the program itself</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_PARAGRAPHS</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</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">P</span><span class="plain-syntax">-></span><span class="element-syntax">placed_early</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">placed_very_early</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">defines_macro</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP2" class="internal">Tangler::tangle_paragraph</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="comment"> (f) Opposite of the shebang: a footer</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP20" class="internal">LanguageMethods::gnabehs</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP1">§1</a>.</li></ul><p class="inwebparagraph"><a id="SP1_1_1"></a><b>§1.1.1. </b>This is the result of all those <code class="display"><span class="extract-syntax">@d</span></code> definitions; note that these sometimes
|
|
extend across multiple lines.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="named-paragraph-defn">Tangle all the constant definitions in section order</span> <span class="named-paragraph-number">1.1.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">chapter</span><span class="plain-syntax"> *</span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">section</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_WITHIN_TANGLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">category</span><span class="plain-syntax"> == </span><span class="constant-syntax">BEGIN_DEFINITION_LCAT</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">default_defn</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Define the constant</span> <span class="named-paragraph-number">1.1.1.1</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_WITHIN_TANGLE</span><span class="plain-syntax">(</span><span class="identifier-syntax">C</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">category</span><span class="plain-syntax"> == </span><span class="constant-syntax">BEGIN_DEFINITION_LCAT</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">default_defn</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP17" class="internal">LanguageMethods::open_ifdef</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">text_operand</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Define the constant</span> <span class="named-paragraph-number">1.1.1.1</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP17" class="internal">LanguageMethods::close_ifdef</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">text_operand</span><span class="plain-syntax">, </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="2-ec.html#SP4" class="internal">Enumerations::define_extents</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">target</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP1_1">§1.1</a>.</li></ul><p class="inwebparagraph"><a id="SP1_1_1_1"></a><b>§1.1.1.1. </b><code class="display">
|
|
<<span class="named-paragraph-defn">Define the constant</span> <span class="named-paragraph-number">1.1.1.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="identifier-syntax">owning_paragraph</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="1-pc.html#SP8" class="internal">Main::error_in_web</a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"misplaced definition"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="2-tgs.html#SP7" class="internal">Tags::open_ifdefs</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP10" class="internal">LanguageMethods::start_definition</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="identifier-syntax">text_operand</span><span class="plain-syntax">,</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="identifier-syntax">text_operand2</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">next_line</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="identifier-syntax">next_line</span><span class="plain-syntax">-></span><span class="element-syntax">category</span><span class="plain-syntax"> == </span><span class="constant-syntax">CONT_DEFINITION_LCAT</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">next_line</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP10" class="internal">LanguageMethods::prolong_definition</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP10" class="internal">LanguageMethods::end_definition</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</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">L</span><span class="plain-syntax">-></span><span class="identifier-syntax">owning_paragraph</span><span class="plain-syntax">) </span><a href="2-tgs.html#SP7" class="internal">Tags::close_ifdefs</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP1_1_1">§1.1.1</a> (twice).</li></ul><p class="inwebparagraph"><a id="SP1_2"></a><b>§1.2. </b><code class="display">
|
|
<<span class="named-paragraph-defn">Tangle any imported headers</span> <span class="named-paragraph-number">1.2</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">headers</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/3-shl.html#SP3" class="internal">Shell::copy</a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><a href="2-tr.html#SP7" class="internal">Reader::tangled_folder</a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">), </span><span class="string-syntax">""</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP1">§1</a>.</li></ul><p class="inwebparagraph"><a id="SP2"></a><b>§2. </b>So here is the main tangler for a single paragraph. We basically expect to
|
|
act only on <code class="display"><span class="extract-syntax">CODE_BODY_LCAT</span></code> lines (those containing actual code), unless
|
|
something quirky has been done to support a language feature.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Tangler::tangle_paragraph</span><button class="popup" onclick="togglePopup('usagePopup2')">...<span class="popuptext" id="usagePopup2">Usage of <b>Tangler::tangle_paragraph</b>:<br><a href="3-tt.html#SP1_1">§1.1</a>, <a href="3-tt.html#SP3_1">§3.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">paragraph</span><span class="plain-syntax"> *</span><span class="identifier-syntax">P</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="2-tgs.html#SP7" class="internal">Tags::open_ifdefs</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">contiguous</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">first_line_in_paragraph</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> ((</span><span class="identifier-syntax">L</span><span class="plain-syntax">) && (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax"> == </span><span class="identifier-syntax">P</span><span class="plain-syntax">)); </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">next_line</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-lm.html#SP14" class="internal">LanguageMethods::will_insert_in_tangle</a><span class="plain-syntax">(</span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">under_section</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Insert line marker if necessary to show the origin of this code</span> <span class="named-paragraph-number">2.1</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP14" class="internal">LanguageMethods::insert_in_tangle</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">under_section</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</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">L</span><span class="plain-syntax">-></span><span class="element-syntax">category</span><span class="plain-syntax"> != </span><span class="constant-syntax">CODE_BODY_LCAT</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">suppress_tangling</span><span class="plain-syntax">)) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">contiguous</span><span class="plain-syntax"> = </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Insert line marker if necessary to show the origin of this code</span> <span class="named-paragraph-number">2.1</span>><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP3" class="internal">Tangler::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-></span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">under_section</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">); </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"\n"</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><a href="2-tgs.html#SP7" class="internal">Tags::close_ifdefs</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre><p class="inwebparagraph"><a id="SP2_1"></a><b>§2.1. </b>The tangled file is, as the term suggests, a tangle, with lines coming
|
|
from many different origins. Some programming languages (C, for instance)
|
|
support a notation to tell the compiler that code has come from somewhere
|
|
else; if so, here's where we use it.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="named-paragraph-defn">Insert line marker if necessary to show the origin of this code</span> <span class="named-paragraph-number">2.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">contiguous</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">contiguous</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP15" class="internal">LanguageMethods::insert_line_marker</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">P</span><span class="plain-syntax">-></span><span class="element-syntax">under_section</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP2">§2</a> (twice).</li></ul><p class="inwebparagraph"><a id="SP3"></a><b>§3. The Code Tangler. </b>All of the final tangled code passes through the following routine.
|
|
Almost all of the time, it simply prints <code class="display"><span class="extract-syntax">original</span></code> verbatim to the file <code class="display"><span class="extract-syntax">OUT</span></code>.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">Tangler::tangle_line</span><button class="popup" onclick="togglePopup('usagePopup3')">...<span class="popuptext" id="usagePopup3">Usage of <b>Tangler::tangle_line</b>:<br><a href="3-tt.html#SP2">§2</a>, <a href="3-tt.html#SP3_1">§3.1</a>, <a href="3-tt.html#SP3_2">§3.2</a>, ACME Support - <a href="4-as.html#SP3">§3</a><br>C-Like Languages - <a href="4-cl.html#SP5">§5</a><br>InC Support - <a href="4-is.html#SP9_1_2_1">§9.1.2.1</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="reserved-syntax">section</span><span class="plain-syntax"> *</span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">L</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">mlen</span><span class="plain-syntax">, </span><span class="identifier-syntax">slen</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">mpos</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP3" class="internal">Regexp::find_expansion</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="character-syntax">'@'</span><span class="plain-syntax">, </span><span class="character-syntax">'<'</span><span class="plain-syntax">, </span><span class="character-syntax">'@'</span><span class="plain-syntax">, </span><span class="character-syntax">'>'</span><span class="plain-syntax">, &</span><span class="identifier-syntax">mlen</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">spos</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP3" class="internal">Regexp::find_expansion</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="character-syntax">'['</span><span class="plain-syntax">, </span><span class="character-syntax">'['</span><span class="plain-syntax">, </span><span class="character-syntax">']'</span><span class="plain-syntax">, </span><span class="character-syntax">']'</span><span class="plain-syntax">, &</span><span class="identifier-syntax">slen</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">mpos</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">) && ((</span><span class="identifier-syntax">spos</span><span class="plain-syntax"> == -1) || (</span><span class="identifier-syntax">mpos</span><span class="plain-syntax"> <= </span><span class="identifier-syntax">spos</span><span class="plain-syntax">)) &&</span>
|
|
<span class="plain-syntax"> (</span><a href="4-lm.html#SP12" class="internal">LanguageMethods::allow_expansion</a><span class="plain-syntax">(</span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">original</span><span class="plain-syntax">)))</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Expand a paragraph macro</span> <span class="named-paragraph-number">3.1</span>>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">spos</span><span class="plain-syntax"> >= </span><span class="constant-syntax">0</span><span class="plain-syntax">)</span>
|
|
<span class="plain-syntax"> </span><<span class="named-paragraph">Expand a double-square command</span> <span class="named-paragraph-number">3.2</span>>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP19" class="internal">LanguageMethods::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">original</span><span class="plain-syntax">); </span><span class="comment"> this is usually what happens</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre><p class="inwebparagraph"><a id="SP3_1"></a><b>§3.1. </b>The first form of escape is a paragraph macro in the middle of code. For
|
|
example, we handle
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> if (banana_count == 0) @<Yes, we have no bananas@>;</span>
|
|
</pre>
|
|
<p class="inwebparagraph">by calling the lower-level tangler on <code class="display"><span class="extract-syntax">if (banana_count == 0) </span></code> (a substring
|
|
which we know can't involve any macros, since we are detecting macros from
|
|
left to right, and this is to the left of the one we found); then by tangling
|
|
the definition of "Yes, we have no bananas"; then by calling the upper-level
|
|
code tangler on <code class="display"><span class="extract-syntax">;</span></code>. (In this case, of course, there's nothing much there,
|
|
but in principle it could contain further macros.)
|
|
</p>
|
|
|
|
<p class="inwebparagraph">Note that when we've expanded "Yes, we have no bananas" we have certainly
|
|
placed code into the tangled file from a different location; that will insert
|
|
a <code class="display"><span class="extract-syntax">#line</span></code> marker for the definition location; and we don't want the eventual
|
|
C compiler to think that the code which follows is also from that location.
|
|
So we insert a fresh line marker.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="named-paragraph-defn">Expand a paragraph macro</span> <span class="named-paragraph-number">3.1</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP17" class="internal">Str::copy</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">original</span><span class="plain-syntax">); </span><a href="../foundation-module/4-sm.html#SP15" class="internal">Str::truncate</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">mpos</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP19" class="internal">LanguageMethods::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">lang</span><span class="plain-syntax"> = </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">;</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</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">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">mlen</span><span class="plain-syntax">-4; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><a href="../foundation-module/4-sm.html#SP14" class="internal">Str::put_at</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get_at</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">mpos</span><span class="plain-syntax">+2+</span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="internal">Str::truncate</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">mlen</span><span class="plain-syntax">-4);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">para_macro</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pmac</span><span class="plain-syntax"> = </span><a href="2-pm.html#SP3" class="internal">Macros::find_by_name</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</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">pmac</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP16" class="internal">LanguageMethods::before_macro_expansion</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">pmac</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP2" class="internal">Tangler::tangle_paragraph</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">pmac</span><span class="plain-syntax">-></span><span class="element-syntax">defining_paragraph</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP16" class="internal">LanguageMethods::after_macro_expansion</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">pmac</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP15" class="internal">LanguageMethods::insert_line_marker</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
|
|
<span class="plain-syntax"> </span><a href="1-pc.html#SP8" class="internal">Main::error_in_web</a><span class="plain-syntax">(</span><span class="identifier-syntax">I</span><span class="string-syntax">"unknown macro"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</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="constant-syntax">STDERR</span><span class="plain-syntax">, </span><span class="string-syntax">"Macro is '%S'\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP18" class="internal">LanguageMethods::comment</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">lang</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">); </span><span class="comment"> recover by putting macro name in comment</span>
|
|
<span class="plain-syntax"> }</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">rest</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="internal">Str::substr</a><span class="plain-syntax">(</span><span class="identifier-syntax">rest</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="internal">Str::at</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">mpos</span><span class="plain-syntax"> + </span><span class="identifier-syntax">mlen</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="internal">Str::end</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP3" class="internal">Tangler::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">rest</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</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">rest</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">temp</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP3">§3</a>.</li></ul><p class="inwebparagraph"><a id="SP3_2"></a><b>§3.2. </b>This is a similar matter, except that it expands bibliographic data:
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> printf("This is build [[Build Number]].\n");</span>
|
|
</pre>
|
|
<p class="inwebparagraph">takes the bibliographic data for "Build Number" (as set on the web's contents
|
|
page) and substitutes that, so that we end up with (say)
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">printf</span><span class="plain-syntax">(</span><span class="string-syntax">"This is build 5Q47.\n"</span><span class="plain-syntax">);</span>
|
|
</pre>
|
|
<p class="inwebparagraph">In some languages there are also special expansions (for example, in
|
|
InC <code class="display"><span class="extract-syntax">[[nonterminals]]</span></code> has a special meaning).
|
|
</p>
|
|
|
|
<p class="inwebparagraph">If the text in double-squares isn't recognised, that's not an error: it simply
|
|
passes straight through. So <code class="display"><span class="extract-syntax">[[water]]</span></code> becomes just <code class="display"><span class="extract-syntax">[[water]]</span></code>.
|
|
</p>
|
|
|
|
|
|
<p class="macrodefinition"><code class="display">
|
|
<<span class="named-paragraph-defn">Expand a double-square command</span> <span class="named-paragraph-number">3.2</span>> =
|
|
</code></p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</span><span class="plain-syntax"> = </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">owning_web</span><span class="plain-syntax">;</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</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">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">spos</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">PUT_TO</span><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get_at</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="4-lm.html#SP19" class="internal">LanguageMethods::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">for</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">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax"><</span><span class="identifier-syntax">slen</span><span class="plain-syntax">-4; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><a href="../foundation-module/4-sm.html#SP14" class="internal">Str::put_at</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">i</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get_at</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">spos</span><span class="plain-syntax">+2+</span><span class="identifier-syntax">i</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP15" class="internal">Str::truncate</a><span class="plain-syntax">(</span><span class="identifier-syntax">temp</span><span class="plain-syntax">, </span><span class="identifier-syntax">slen</span><span class="plain-syntax">-4);</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="4-lm.html#SP13" class="internal">LanguageMethods::special_tangle_command</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">-></span><span class="element-syntax">sect_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">) == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) {</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><a href="../foundation-module/8-bdfw.html#SP6" class="internal">Bibliographic::look_up_datum</a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">md</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">))</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S"</span><span class="plain-syntax">, </span><a href="../foundation-module/8-bdfw.html#SP6" class="internal">Bibliographic::get_datum</a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">md</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><span class="reserved-syntax">else</span>
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"[[%S]]"</span><span class="plain-syntax">, </span><span class="identifier-syntax">temp</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> }</span>
|
|
|
|
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">rest</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP26" class="internal">Str::substr</a><span class="plain-syntax">(</span><span class="identifier-syntax">rest</span><span class="plain-syntax">, </span><a href="../foundation-module/4-sm.html#SP10" class="internal">Str::at</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">, </span><span class="identifier-syntax">spos</span><span class="plain-syntax"> + </span><span class="identifier-syntax">slen</span><span class="plain-syntax">), </span><a href="../foundation-module/4-sm.html#SP10" class="internal">Str::end</a><span class="plain-syntax">(</span><span class="identifier-syntax">original</span><span class="plain-syntax">));</span>
|
|
<span class="plain-syntax"> </span><a href="3-tt.html#SP3" class="internal">Tangler::tangle_line</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">rest</span><span class="plain-syntax">, </span><span class="identifier-syntax">S</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</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">rest</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">temp</span><span class="plain-syntax">);</span>
|
|
</pre><ul class="endnotetexts"><li>This code is used in <a href="3-tt.html#SP3">§3</a>.</li></ul><p class="inwebparagraph"><a id="SP4"></a><b>§4. Prinary target. </b>The first target in a web is always the one for the main program.
|
|
</p>
|
|
|
|
<pre class="displayed-code all-displayed-code">
|
|
<span class="reserved-syntax">tangle_target</span><span class="plain-syntax"> *</span><span class="function-syntax">Tangler::primary_target</span><button class="popup" onclick="togglePopup('usagePopup4')">...<span class="popuptext" id="usagePopup4">Usage of <b>Tangler::primary_target</b>:<br>Program Control - <a href="1-pc.html#SP7_4_2">§7.4.2</a><br>The Analyser - <a href="3-ta.html#SP4">§4</a>, <a href="3-ta.html#SP4_1">§4.1</a><br>ACME Support - <a href="4-as.html#SP4">§4</a>, <a href="4-as.html#SP5">§5</a><br>C-Like Languages - <a href="4-cl.html#SP2_1">§2.1</a>, <a href="4-cl.html#SP3">§3</a>, <a href="4-cl.html#SP6_1">§6.1</a>, <a href="4-cl.html#SP6_4">§6.4</a><br>InC Support - <a href="4-is.html#SP3">§3</a>, <a href="4-is.html#SP6">§6</a>, <a href="4-is.html#SP7">§7</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">web</span><span class="plain-syntax"> *</span><span class="identifier-syntax">W</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">W</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><span class="identifier-syntax">internal_error</span><span class="plain-syntax">(</span><span class="string-syntax">"no such web"</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">FIRST_IN_LINKED_LIST</span><span class="plain-syntax">(</span><span class="reserved-syntax">tangle_target</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-></span><span class="element-syntax">tangle_targets</span><span class="plain-syntax">);</span>
|
|
<span class="plain-syntax">}</span>
|
|
</pre><hr class="tocbar">
|
|
<ul class="toc"><li><a href="3-twot.html">Back to 'The Weaver of Text'</a></li><li><i>(This section ends Chapter 3: Outputs.)</i></li></ul><hr class="tocbar">
|
|
<!--End of weave-->
|
|
</main>
|
|
</body>
|
|
</html>
|
|
|