inweb-bootstrap/docs/inweb/4-cl.html

602 lines
108 KiB
HTML
Raw Normal View History

2019-02-04 22:26:45 +00:00
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
2020-04-08 22:41:00 +00:00
<title>C-Like Languages</title>
2020-04-20 22:26:08 +00:00
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
2019-02-04 22:26:45 +00:00
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
2020-04-20 22:26:08 +00:00
<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">
2020-04-21 16:55:17 +00:00
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
2020-04-20 22:26:08 +00:00
2019-02-04 22:26:45 +00:00
</head>
<body>
<nav role="navigation">
2020-04-13 16:06:45 +00:00
<h1><a href="../index.html">
2020-04-20 22:26:08 +00:00
<img src="../docs-assets/Octagram.png" width=72 height=72">
2020-04-13 16:06:45 +00:00
</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>
2020-04-13 16:06:45 +00:00
</ul><h2>Example Webs</h2><ul>
2020-04-12 16:24:23 +00:00
<li><a href="../goldbach/index.html">goldbach</a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
2020-04-15 22:45:08 +00:00
<li><a href="../eastertide/index.html">eastertide</a></li>
2020-04-14 17:36:42 +00:00
</ul><h2>Repository</h2><ul>
2020-04-20 22:34:44 +00:00
<li><a href="https://github.com/ganelson/inweb"><img src="../docs-assets/github.png" height=18> github</a></li>
2020-04-14 17:36:42 +00:00
</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>
2020-04-13 16:06:45 +00:00
</ul>
</nav>
<main role="main">
2020-04-16 22:51:03 +00:00
<!--Weave of 'C-Like Languages' generated by Inweb-->
2020-04-13 16:06:45 +00:00
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">inweb</a></li><li><a href="index.html#4">Chapter 4: Languages</a></li><li><b>C-Like Languages</b></li></ul><p class="purpose">To provide special features for the whole C family of languages.</p>
2019-02-04 22:26:45 +00:00
2020-04-16 22:51:03 +00:00
<ul class="toc"><li><a href="4-cl.html#SP1">&#167;1. </a></li><li><a href="4-cl.html#SP2">&#167;2. Parsing</a></li><li><a href="4-cl.html#SP2_2">&#167;2.2. Structure dependency</a></li><li><a href="4-cl.html#SP3">&#167;3. Functions</a></li><li><a href="4-cl.html#SP4">&#167;4. Subcategorisation</a></li><li><a href="4-cl.html#SP5">&#167;5. Tangling extras</a></li><li><a href="4-cl.html#SP6">&#167;6. Tangling predeclarations</a></li><li><a href="4-cl.html#SP7">&#167;7. Overriding regular code weaving</a></li></ul><hr class="tocbar">
2019-02-04 22:26:45 +00:00
2020-04-04 12:07:08 +00:00
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. </b>What makes a language C-like?
2019-02-04 22:26:45 +00:00
This does:
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::make_c_like</span><button class="popup" onclick="togglePopup('usagePopup1')">...<span class="popuptext" id="usagePopup1">Usage of <b>CLike::make_c_like</b>:<br>Programming Languages - <a href="4-pl.html#SP7_2">&#167;7.2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">pl</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">PARSE_TYPES_PAR_MTID</span><span class="plain-syntax">, </span><a href="4-cl.html#SP2" class="internal">CLike::parse_types</a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">PARSE_FUNCTIONS_PAR_MTID</span><span class="plain-syntax">, </span><a href="4-cl.html#SP3" class="internal">CLike::parse_functions</a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">SUBCATEGORISE_LINE_PAR_MTID</span><span class="plain-syntax">, </span><a href="4-cl.html#SP4" class="internal">CLike::subcategorise_code</a><span class="plain-syntax">);</span>
2020-04-20 22:26:08 +00:00
2020-04-21 16:55:17 +00:00
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ADDITIONAL_EARLY_MATTER_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-cl.html#SP5" class="internal">CLike::additional_early_matter</a><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">METHOD_ADD</span><span class="plain-syntax">(</span><span class="identifier-syntax">pl</span><span class="plain-syntax">, </span><span class="constant-syntax">ADDITIONAL_PREDECLARATIONS_TAN_MTID</span><span class="plain-syntax">, </span><a href="4-cl.html#SP6" class="internal">CLike::additional_predeclarations</a><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Parsing. </b>After a web has been read in and then parsed, code supporting its language
2019-02-04 22:26:45 +00:00
is then called to do any further parsing it might want to. The code below
is run if the language is "C-like": regular C and InC both qualify.
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::parse_types</span><button class="popup" onclick="togglePopup('usagePopup2')">...<span class="popuptext" id="usagePopup2">Usage of <b>CLike::parse_types</b>:<br><a href="4-cl.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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>&lt;<span class="named-paragraph">Find every typedef struct in the tangle</span> <span class="named-paragraph-number">2.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Work out which structs contain which others</span> <span class="named-paragraph-number">2.2</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP2_1"></a><b>&#167;2.1. </b>We're going to assume that the C source code uses structures looking
2019-02-04 22:26:45 +00:00
something like this:
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">typedef</span><span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">fruit</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">pip</span><span class="plain-syntax"> </span><span class="identifier-syntax">the_pips</span><span class="plain-syntax">[5];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">struct</span><span class="plain-syntax"> </span><span class="identifier-syntax">fruit</span><span class="plain-syntax"> *</span><span class="identifier-syntax">often_confused_with</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">tree_species</span><span class="plain-syntax"> *</span><span class="identifier-syntax">grows_on</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">typical_weight</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="identifier-syntax">fruit</span><span class="plain-syntax">;</span>
2019-02-04 22:26:45 +00:00
</pre>
<p class="inwebparagraph">which adopts the traditional layout conventions of Kernighan and Ritchie.
The structure definitions in this Inweb web all take the required form,
of course, and provide many more examples.
</p>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">Note that a <code class="display"><span class="extract-syntax">fruit</span></code> structure contains a <code class="display"><span class="extract-syntax">pip</span></code> structure (in fact, five of
them), but only contains pointers to <code class="display"><span class="extract-syntax">tree_species</span></code> structures and itself.
C requires therefore that the structure definition for <code class="display"><span class="extract-syntax">pip</span></code> must occur
earlier in the code than that for <code class="display"><span class="extract-syntax">fruit</span></code>. This is a nuisance, so Inweb
2019-02-04 22:26:45 +00:00
takes care of it automatically.
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Find every typedef struct in the tangle</span> <span class="named-paragraph-number">2.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_str</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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="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><a href="3-tt.html#SP4" class="internal">Tangler::primary_target</a><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">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"typedef struct (%i+) %c*{%c*"</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_str</span><span class="plain-syntax"> = </span><a href="4-taf.html#SP2" class="internal">Functions::new_struct</a><span class="plain-syntax">(</span><span class="identifier-syntax">W</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0], </span><span class="identifier-syntax">L</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="2-tgs.html#SP4" class="internal">Tags::add_by_name</a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">owning_paragraph</span><span class="plain-syntax">, </span><span class="identifier-syntax">I</span><span class="string-syntax">"Structures"</span><span class="plain-syntax">);</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><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get_first_char</a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">) == </span><span class="character-syntax">'}'</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">current_str</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">current_str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">typedef_ends</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">current_str</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">;</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">current_str</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">current_str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">typedef_ends</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Work through a line in the structure definition</span> <span class="named-paragraph-number">2.1.1</span>&gt;<span class="plain-syntax">;</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><a href="../foundation-module/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"typedef %c+"</span><span class="plain-syntax">)) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"%c+##%c+"</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><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">-&gt;</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="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax"> = </span><span class="constant-syntax">TYPEDEF_LCAT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2">&#167;2</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1"></a><b>&#167;2.1.1. </b>At this point we're reading a line within the structure's definition; for
2019-02-04 22:26:45 +00:00
the sake of an illustrative example, let's suppose that line is:
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> unsigned long long int *val;</span>
2019-02-04 22:26:45 +00:00
</pre>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">We need to extract the element name, <code class="display"><span class="extract-syntax">val</span></code>, and make a note of it.
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Work through a line in the structure definition</span> <span class="named-paragraph-number">2.1.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<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">p</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">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP24" class="internal">Str::trim_white_space</a><span class="plain-syntax">(</span><span class="identifier-syntax">p</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Remove C type modifiers from the front of p</span> <span class="named-paragraph-number">2.1.1.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">string_position</span><span class="plain-syntax"> </span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP10" class="internal">Str::start</a><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><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) != </span><span class="character-syntax">'/'</span><span class="plain-syntax">) { /* </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">slash</span><span class="plain-syntax"> </span><span class="identifier-syntax">must</span><span class="plain-syntax"> </span><span class="identifier-syntax">introduce</span><span class="plain-syntax"> </span><span class="identifier-syntax">a</span><span class="plain-syntax"> </span><span class="identifier-syntax">comment</span><span class="plain-syntax"> </span><span class="identifier-syntax">here</span><span class="plain-syntax"> */</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Move pos past the type name</span> <span class="named-paragraph-number">2.1.1.2</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Move pos past any typographical type modifiers</span> <span class="named-paragraph-number">2.1.1.3</span>&gt;<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/4-sm.html#SP11" class="internal">Str::in_range</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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">elname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Copy the element name into elname</span> <span class="named-paragraph-number">2.1.1.4</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="4-taf.html#SP4" class="internal">Functions::new_element</a><span class="plain-syntax">(</span><span class="identifier-syntax">current_str</span><span class="plain-syntax">, </span><span class="identifier-syntax">elname</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">elname</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</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">p</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_1">&#167;2.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1_1"></a><b>&#167;2.1.1.1. </b>The following reduces <code class="display"><span class="extract-syntax">unsigned long long int *val;</span></code> to just <code class="display"><span class="extract-syntax">int *val;</span></code>.
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Remove C type modifiers from the front of p</span> <span class="named-paragraph-number">2.1.1.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[] = {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"(struct )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(signed )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(unsigned )(%C%c*)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"(short )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(long )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(static )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">seek_modifiers</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</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">seek_modifiers</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seek_modifiers</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">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]; </span><span class="identifier-syntax">i</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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</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">p</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seek_modifiers</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_1_1">&#167;2.1.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1_2"></a><b>&#167;2.1.1.2. </b>At this point <code class="display"><span class="extract-syntax">p</span></code> has been reduced to <code class="display"><span class="extract-syntax">int *val;</span></code>, but the following moves
2020-04-20 22:26:08 +00:00
<code class="display"><span class="extract-syntax">pos</span></code> to point to the <code class="display"><span class="extract-syntax">*</span></code>:
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Move pos past the type name</span> <span class="named-paragraph-number">2.1.1.2</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">)) &amp;&amp; (</span><a href="../foundation-module/4-chr.html#SP2" class="internal">Characters::is_space_or_tab</a><span class="plain-syntax">(</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</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">pos</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP11" class="internal">Str::forward</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_1_1">&#167;2.1.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1_3"></a><b>&#167;2.1.1.3. </b>And this moves it past the <code class="display"><span class="extract-syntax">*</span></code> to point to the <code class="display"><span class="extract-syntax">v</span></code> in <code class="display"><span class="extract-syntax">int *val;</span></code>:
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Move pos past any typographical type modifiers</span> <span class="named-paragraph-number">2.1.1.3</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> ((</span><a href="../foundation-module/4-chr.html#SP2" class="internal">Characters::is_space_or_tab</a><span class="plain-syntax">(</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">))) || (</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'*'</span><span class="plain-syntax">) ||</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">'('</span><span class="plain-syntax">) || (</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">) == </span><span class="character-syntax">')'</span><span class="plain-syntax">)) </span><span class="identifier-syntax">pos</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP11" class="internal">Str::forward</a><span class="plain-syntax">(</span><span class="identifier-syntax">pos</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_1_1">&#167;2.1.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_1_1_4"></a><b>&#167;2.1.1.4. </b>This then first copies the substring <code class="display"><span class="extract-syntax">val;</span></code> into <code class="display"><span class="extract-syntax">elname</span></code>, then cuts that
2020-04-20 22:26:08 +00:00
down to just the identifier characters at the front, i.e., to <code class="display"><span class="extract-syntax">val</span></code>.
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Copy the element name into elname</span> <span class="named-paragraph-number">2.1.1.4</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<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">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">pos</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">p</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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%i+)%c*"</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">elname</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_1_1">&#167;2.1.1</a>.</li></ul><p class="inwebparagraph"><a id="SP2_2"></a><b>&#167;2.2. Structure dependency. </b>We say that S depends on T if <code class="display"><span class="extract-syntax">struct S</span></code> has an element whose type is
2020-04-20 22:26:08 +00:00
<code class="display"><span class="extract-syntax">struct T</span></code>. That matters because if so then <code class="display"><span class="extract-syntax">struct T</span></code> has to be defined
before <code class="display"><span class="extract-syntax">struct S</span></code> in the tangled output.
2019-02-04 22:26:45 +00:00
</p>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">It's important to note that <code class="display"><span class="extract-syntax">struct S</span></code> merely having a member of type
<code class="display"><span class="extract-syntax">struct *T</span></code> does not create a dependency. In the code below, because <code class="display"><span class="extract-syntax">%i</span></code>
matches only identifier characters and <code class="display"><span class="extract-syntax">*</span></code> is not one of those, a line like
2019-02-04 22:26:45 +00:00
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> struct fruit *often_confused_with;</span>
2019-02-04 22:26:45 +00:00
</pre>
<p class="inwebparagraph">will not trip the switch here.
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Work out which structs contain which others</span> <span class="named-paragraph-number">2.2</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">current_str</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">LOOP_OVER</span><span class="plain-syntax">(</span><span class="identifier-syntax">current_str</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</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">current_str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">structure_header_at</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> ((</span><span class="identifier-syntax">L</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> != </span><span class="identifier-syntax">current_str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">typedef_ends</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">-&gt;</span><span class="element-syntax">next_line</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" struct (%i+) %i%c*"</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">One structure appears to contain a copy of another one</span> <span class="named-paragraph-number">2.2.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2">&#167;2</a>.</li></ul><p class="inwebparagraph"><a id="SP2_2_1"></a><b>&#167;2.2.1. </b><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">One structure appears to contain a copy of another one</span> <span class="named-paragraph-number">2.2.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">text_stream</span><span class="plain-syntax"> *</span><span class="identifier-syntax">used_structure</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">str</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">str</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">language_types</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">str</span><span class="plain-syntax"> != </span><span class="identifier-syntax">current_str</span><span class="plain-syntax">) &amp;&amp;</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-sm.html#SP19" class="internal">Str::eq</a><span class="plain-syntax">(</span><span class="identifier-syntax">used_structure</span><span class="plain-syntax">, </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">structure_name</span><span class="plain-syntax">)))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">ADD_TO_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">current_str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">incorporates</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP2_2">&#167;2.2</a>.</li></ul><p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Functions. </b>This time, we will need to keep track of <code class="display"><span class="extract-syntax">#ifdef</span></code> and <code class="display"><span class="extract-syntax">#endif</span></code> pairs
2020-04-11 20:39:43 +00:00
in the source. This matters because we will want to predeclare functions;
but if functions are declared in conditional compilation, then their
predeclarations have to be made under the same conditions.
</p>
<p class="inwebparagraph">The following stack holds the current set of conditional compilations which the
source line being scanned lies within.
</p>
<pre class="definitions">
2020-04-20 22:26:08 +00:00
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_CONDITIONAL_COMPILATION_STACK</span><span class="plain-syntax"> </span><span class="constant-syntax">8</span>
2020-04-11 20:39:43 +00:00
</pre>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">cc_sp</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="constant-syntax">MAX_CONDITIONAL_COMPILATION_STACK</span><span class="plain-syntax">];</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::parse_functions</span><button class="popup" onclick="togglePopup('usagePopup3')">...<span class="popuptext" id="usagePopup3">Usage of <b>CLike::parse_functions</b>:<br><a href="4-cl.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><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="identifier-syntax">cc_sp</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">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><a href="3-tt.html#SP4" class="internal">Tangler::primary_target</a><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">L</span><span class="plain-syntax">-&gt;</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="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</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="identifier-syntax">L</span><span class="plain-syntax">-&gt;</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>&lt;<span class="named-paragraph">Look for conditional compilation on this line</span> <span class="named-paragraph-number">3.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Look for a function definition on this line</span> <span class="named-paragraph-number">3.2</span>&gt;<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">cc_sp</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</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">"program ended with conditional compilation open"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP3_1"></a><b>&#167;3.1. </b><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Look for conditional compilation on this line</span> <span class="named-paragraph-number">3.1</span>&gt; =
2020-04-11 20:39:43 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#ifn*def %c+"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#IFN*DEF %c+"</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">cc_sp</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">MAX_CONDITIONAL_COMPILATION_STACK</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">"conditional compilation too deeply nested"</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="identifier-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">cc_sp</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><a href="../foundation-module/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#endif *"</span><span class="plain-syntax">)) ||</span>
<span class="plain-syntax"> (</span><a href="../foundation-module/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">" *#ENDIF *"</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">cc_sp</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">0</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">"found #endif without #ifdef or #ifndef"</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="identifier-syntax">cc_sp</span><span class="plain-syntax">--;</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP3">&#167;3</a>.</li></ul><p class="inwebparagraph"><a id="SP3_2"></a><b>&#167;3.2. </b>So, then, we recognise a C function as being a line which takes the form
2019-02-04 22:26:45 +00:00
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> type identifier(args...</span>
2019-02-04 22:26:45 +00:00
</pre>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">where we parse <code class="display"><span class="extract-syntax">type</span></code> only minimally. In InC (only), the identifier can
contain namespace dividers written <code class="display"><span class="extract-syntax">::</span></code>. Function declarations, we will assume,
2019-02-04 22:26:45 +00:00
always begin on column 1 of their source files, and we expect them to take
modern ANSI C style, not the long-deprecated late 1970s C style.
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Look for a function definition on this line</span> <span class="named-paragraph-number">3.2</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!(</span><a href="../foundation-module/4-chr.html#SP2" class="internal">Characters::is_space_or_tab</a><span class="plain-syntax">(</span><a href="../foundation-module/4-sm.html#SP13" class="internal">Str::get_first_char</a><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</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">qualifiers</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">modified</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">modified</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Parse past any type modifiers</span> <span class="named-paragraph-number">3.2.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">modified</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(%i+) (%**)(%i+)%((%c*)"</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">ftype</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">ftype</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">asts</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">asts</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">fname</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">fname</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[2]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">TEMPORARY_TEXT</span><span class="plain-syntax">(</span><span class="identifier-syntax">arguments</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">arguments</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[3]);</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">A function definition was found</span> <span class="named-paragraph-number">3.2.2</span>&gt;<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">ftype</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">asts</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">fname</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">arguments</span><span class="plain-syntax">);</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">qualifiers</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">modified</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP3">&#167;3</a>.</li></ul><p class="inwebparagraph"><a id="SP3_2_1"></a><b>&#167;3.2.1. </b>C has a whole soup of reserved words applying to types, but most of them
2019-02-04 22:26:45 +00:00
can't apply to the return type of a function. We do, however, iterate so that
2020-04-20 22:26:08 +00:00
forms like <code class="display"><span class="extract-syntax">static long long int</span></code> will work.
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Parse past any type modifiers</span> <span class="named-paragraph-number">3.2.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[] = {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"(signed )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(unsigned )(%C%c*)"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"(short )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(long )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"(static )(%C%c*)"</span><span class="plain-syntax">, </span><span class="identifier-syntax">NULL</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">seek_modifiers</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</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">seek_modifiers</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seek_modifiers</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">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]; </span><span class="identifier-syntax">i</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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">modified</span><span class="plain-syntax">, </span><span class="identifier-syntax">modifier_patterns</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">])) {</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-sm.html#SP17" class="internal">Str::concatenate</a><span class="plain-syntax">(</span><span class="identifier-syntax">qualifiers</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0]);</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">modified</span><span class="plain-syntax">, </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[1]);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">seek_modifiers</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">; </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP3_2">&#167;3.2</a>.</li></ul><p class="inwebparagraph"><a id="SP3_2_2"></a><b>&#167;3.2.2. </b><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">A function definition was found</span> <span class="named-paragraph-number">3.2.2</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Soak up further arguments from continuation lines after the declaration</span> <span class="named-paragraph-number">3.2.2.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">language_function</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><a href="4-taf.html#SP7" class="internal">Functions::new_function</a><span class="plain-syntax">(</span><span class="identifier-syntax">fname</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">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_arguments</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-sm.html#SP3" class="internal">Str::duplicate</a><span class="plain-syntax">(</span><span class="identifier-syntax">arguments</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">-&gt;</span><span class="element-syntax">function_type</span><span class="plain-syntax">, </span><span class="string-syntax">"%S%S %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">qualifiers</span><span class="plain-syntax">, </span><span class="identifier-syntax">ftype</span><span class="plain-syntax">, </span><span class="identifier-syntax">asts</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/4-sm.html#SP22" class="internal">Str::eq_wide_string</a><span class="plain-syntax">(</span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_name</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"isdigit"</span><span class="plain-syntax">)) </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">call_freely</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_conditionals</span><span class="plain-syntax"> = </span><span class="identifier-syntax">cc_sp</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">&lt;</span><span class="identifier-syntax">cc_sp</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">within_conditionals</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">cc_stack</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">];</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP3_2">&#167;3.2</a>.</li></ul><p class="inwebparagraph"><a id="SP3_2_2_1"></a><b>&#167;3.2.2.1. </b>In some cases the function's declaration runs over several lines:
2019-02-04 22:26:45 +00:00
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="identifier-syntax">World::Subjects::make_adj_const_domain</span><span class="plain-syntax">(</span><span class="identifier-syntax">inference_subject</span><span class="plain-syntax"> *</span><span class="identifier-syntax">infs</span><span class="plain-syntax">,|</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">instance</span><span class="plain-syntax"> *</span><span class="identifier-syntax">nc</span><span class="plain-syntax">, </span><span class="identifier-syntax">property</span><span class="plain-syntax"> *</span><span class="identifier-syntax">prn</span><span class="plain-syntax">) {|</span>
2019-02-04 22:26:45 +00:00
</pre>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">Having read the first line, <code class="display"><span class="extract-syntax">arguments</span></code> would contain <code class="display"><span class="extract-syntax">inference_subject *infs,</span></code>
2019-02-04 22:26:45 +00:00
and would thus be incomplete. We continue across subsequent lines until we
2020-04-20 22:26:08 +00:00
reach an open brace <code class="display"><span class="extract-syntax">{</span></code>.
2019-02-04 22:26:45 +00:00
</p>
<pre class="definitions">
2020-04-20 22:26:08 +00:00
<span class="definition-keyword">define</span> <span class="constant-syntax">MAX_ARG_LINES</span><span class="plain-syntax"> </span><span class="constant-syntax">32</span><span class="plain-syntax"> </span><span class="comment"> maximum number of lines over which a function's header can extend</span>
2019-02-04 22:26:45 +00:00
</pre>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Soak up further arguments from continuation lines after the declaration</span> <span class="named-paragraph-number">3.2.2.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">source_line</span><span class="plain-syntax"> *</span><span class="identifier-syntax">AL</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">arg_lc</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">while</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">AL</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">arg_lc</span><span class="plain-syntax"> &lt;= </span><span class="constant-syntax">MAX_ARG_LINES</span><span class="plain-syntax">) &amp;&amp; (</span><a href="../foundation-module/4-pm.html#SP4" class="internal">Regexp::find_open_brace</a><span class="plain-syntax">(</span><span class="identifier-syntax">arguments</span><span class="plain-syntax">) == -1)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">AL</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_line</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</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">err_mess</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">err_mess</span><span class="plain-syntax">, </span><span class="string-syntax">"Function '%S' has a malformed declaration"</span><span class="plain-syntax">, </span><span class="identifier-syntax">fname</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">err_mess</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">err_mess</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">AL</span><span class="plain-syntax"> = </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_line</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">arguments</span><span class="plain-syntax">, </span><span class="string-syntax">" %S"</span><span class="plain-syntax">, </span><span class="identifier-syntax">AL</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">arg_lc</span><span class="plain-syntax">++;</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">n</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP4" class="internal">Regexp::find_open_brace</a><span class="plain-syntax">(</span><span class="identifier-syntax">arguments</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">n</span><span class="plain-syntax"> &gt;= </span><span class="constant-syntax">0</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">arguments</span><span class="plain-syntax">, </span><span class="identifier-syntax">n</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP3_2_2">&#167;3.2.2</a>.</li></ul><p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. Subcategorisation. </b>The following is called after the parser gives every line in the web a
2019-02-04 22:26:45 +00:00
category; we can, if we wish, change that for a more exotic one. We simply
2020-04-20 22:26:08 +00:00
look for a <code class="display"><span class="extract-syntax">#include</span></code> of one of the ANSI C standard libraries.
2019-02-04 22:26:45 +00:00
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::subcategorise_code</span><button class="popup" onclick="togglePopup('usagePopup4')">...<span class="popuptext" id="usagePopup4">Usage of <b>CLike::subcategorise_code</b>:<br><a href="4-cl.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"#include &lt;(%C+)&gt;%c*"</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">library_file</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mr</span><span class="plain-syntax">.</span><span class="element-syntax">exp</span><span class="plain-syntax">[0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">wchar_t</span><span class="plain-syntax"> *</span><span class="identifier-syntax">ansi_libs</span><span class="plain-syntax">[] = {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"assert.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"ctype.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"errno.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"float.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"limits.h"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"locale.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"math.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"setjmp.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"signal.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"stdarg.h"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"stddef.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"stdio.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"stdlib.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"string.h"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="string-syntax">"time.h"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">NULL</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">j</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">; </span><span class="identifier-syntax">ansi_libs</span><span class="plain-syntax">[</span><span class="identifier-syntax">j</span><span class="plain-syntax">]; </span><span class="identifier-syntax">j</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/4-sm.html#SP22" class="internal">Str::eq_wide_string</a><span class="plain-syntax">(</span><span class="identifier-syntax">library_file</span><span class="plain-syntax">, </span><span class="identifier-syntax">ansi_libs</span><span class="plain-syntax">[</span><span class="identifier-syntax">j</span><span class="plain-syntax">]))</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax"> = </span><span class="constant-syntax">C_LIBRARY_INCLUDE_LCAT</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::dispose_of</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Tangling extras. </b>"Additional early matter" is used for the inclusions of the ANSI library
2019-02-04 22:26:45 +00:00
files. We need to do that early, because otherwise types declared in them
2020-04-20 22:26:08 +00:00
(such as <code class="display"><span class="extract-syntax">FILE</span></code>) won't exist in time for the structure definitions we will
2019-02-04 22:26:45 +00:00
be tangling next.
</p>
2020-04-20 22:26:08 +00:00
<p class="inwebparagraph">It might seem reasonable to move all <code class="display"><span class="extract-syntax">#include</span></code> files up front this way,
2019-02-04 22:26:45 +00:00
not just the ANSI ones. But that would defeat any conditional compilation
around the inclusions; which Inform (for instance) needs in order to make
platform-specific details to handle directories without POSIX in Windows.
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::additional_early_matter</span><button class="popup" onclick="togglePopup('usagePopup5')">...<span class="popuptext" id="usagePopup5">Usage of <b>CLike::additional_early_matter</b>:<br><a href="4-cl.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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="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="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">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax"> == </span><span class="constant-syntax">C_LIBRARY_INCLUDE_LCAT</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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</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">-&gt;</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="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><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">-&gt;</span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Tangling predeclarations. </b>This is where a language gets the chance to tangle predeclarations, early
on in the file. We use it first for the structures, and then the functions &mdash;
2019-02-04 22:26:45 +00:00
in that order since the function types likely involve the typedef names for the
structures.
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::additional_predeclarations</span><button class="popup" onclick="togglePopup('usagePopup6')">...<span class="popuptext" id="usagePopup6">Usage of <b>CLike::additional_predeclarations</b>:<br><a href="4-cl.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</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="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>&lt;<span class="named-paragraph">Predeclare the structures in a well-founded order</span> <span class="named-paragraph-number">6.2</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Predeclare simple typedefs</span> <span class="named-paragraph-number">6.1</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax"> </span>&lt;<span class="named-paragraph">Predeclare the functions</span> <span class="named-paragraph-number">6.4</span>&gt;<span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP6_1"></a><b>&#167;6.1. </b>A "simple typedef" here means one that is aliasing something other than
2020-04-20 22:26:08 +00:00
a structure: for example <code class="display"><span class="extract-syntax">typedef unsigned int uint;</span></code> would be a simple typedef.
2019-02-04 22:26:45 +00:00
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Predeclare simple typedefs</span> <span class="named-paragraph-number">6.1</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<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><a href="3-tt.html#SP4" class="internal">Tangler::primary_target</a><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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">category</span><span class="plain-syntax"> == </span><span class="constant-syntax">TYPEDEF_LCAT</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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</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">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">main_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</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">"\n"</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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP6">&#167;6</a>.</li></ul><p class="inwebparagraph"><a id="SP6_2"></a><b>&#167;6.2. </b>It's easy enough to make sure structures are tangled so that inner ones
2019-02-04 22:26:45 +00:00
precede outer, but we need to be careful to be terminating if the source
code we're given is not well founded because of an error by its programmer:
for example, that structure A contains B contains C contains A. We do this
2020-04-20 22:26:08 +00:00
with the <code class="display"><span class="extract-syntax">tangled</span></code> flag, which is <code class="display"><span class="extract-syntax">FALSE</span></code> if a structure hasn't been
started yet, <code class="display"><span class="extract-syntax">NOT_APPLICABLE</span></code> if it's in progress, and <code class="display"><span class="extract-syntax">TRUE</span></code> if it's
2019-02-04 22:26:45 +00:00
finished.
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Predeclare the structures in a well-founded order</span> <span class="named-paragraph-number">6.2</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">str</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">str</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">language_types</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tangled</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">LOOP_OVER_LINKED_LIST</span><span class="plain-syntax">(</span><span class="identifier-syntax">str</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">language_types</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-cl.html#SP6_3" class="internal">CLike::tangle_structure</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="identifier-syntax">str</span><span class="plain-syntax">);</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP6">&#167;6</a>.</li></ul><p class="inwebparagraph"><a id="SP6_3"></a><b>&#167;6.3. </b>Using the following recursion, which is therefore terminating:
2019-02-04 22:26:45 +00:00
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">CLike::tangle_structure</span><button class="popup" onclick="togglePopup('usagePopup7')">...<span class="popuptext" id="usagePopup7">Usage of <b>CLike::tangle_structure</b>:<br><a href="4-cl.html#SP6_2">&#167;6.2</a></span></button><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">programming_language</span><span class="plain-syntax"> *</span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">str</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">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tangled</span><span class="plain-syntax"> != </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tangled</span><span class="plain-syntax"> = </span><span class="constant-syntax">NOT_APPLICABLE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">language_type</span><span class="plain-syntax"> *</span><span class="identifier-syntax">embodied</span><span class="plain-syntax"> = </span><span class="identifier-syntax">NULL</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">embodied</span><span class="plain-syntax">, </span><span class="reserved-syntax">language_type</span><span class="plain-syntax">, </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">incorporates</span><span class="plain-syntax">)</span>
<span class="plain-syntax"> </span><a href="4-cl.html#SP6_3" class="internal">CLike::tangle_structure</a><span class="plain-syntax">(</span><span class="identifier-syntax">OUT</span><span class="plain-syntax">, </span><span class="identifier-syntax">self</span><span class="plain-syntax">, </span><span class="identifier-syntax">embodied</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">tangled</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</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">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">structure_header_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</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">self</span><span class="plain-syntax">, </span><span class="identifier-syntax">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">structure_header_at</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">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">structure_header_at</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="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">next_line</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\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">suppress_tangling</span><span class="plain-syntax"> = </span><span class="constant-syntax">TRUE</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">str</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">typedef_ends</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</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">str</span><span class="plain-syntax">-&gt;</span><span class="identifier-syntax">structure_header_at</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre><p class="inwebparagraph"><a id="SP6_4"></a><b>&#167;6.4. </b>Functions are rather easier to deal with. In general, if a function was
2020-04-20 22:26:08 +00:00
defined within some number of nested <code class="display"><span class="extract-syntax">#ifdef</span></code> or <code class="display"><span class="extract-syntax">#ifndef</span></code> directives, then
2019-02-04 22:26:45 +00:00
we reproduce those around the predeclaration: except, as a special trick,
if the line contains a particular comment. For example:
</p>
2020-04-21 16:55:17 +00:00
<pre class="displayed-code all-displayed-code">
<span class="plain-syntax"> #ifdef SOLARIS /* inweb: always predeclare */</span>
2019-02-04 22:26:45 +00:00
</pre>
<p class="inwebparagraph">That exempts any functions inside this condition from meeting the condition
in order to be predeclared. It's a trick used in the foundation module just
a couple of times: the idea is that although a definition of the functions
is given which only works under SOLARIS, an external piece of code will
provide alternative function definitions which would work without SOLARIS.
The functions therefore need predeclaration regardless, because they will
exist either way.
</p>
<p class="macrodefinition"><code class="display">
2020-04-20 22:26:08 +00:00
&lt;<span class="named-paragraph-defn">Predeclare the functions</span> <span class="named-paragraph-number">6.4</span>&gt; =
2019-02-04 22:26:45 +00:00
</code></p>
2020-04-21 16:55:17 +00:00
<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><a href="3-tt.html#SP4" class="internal">Tangler::primary_target</a><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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_defined</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</span><span class="plain-syntax">-&gt;</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="plain-syntax"> </span><span class="reserved-syntax">language_function</span><span class="plain-syntax"> *</span><span class="identifier-syntax">fn</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_defined</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">to_close</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">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">&lt;</span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">no_conditionals</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">match_results</span><span class="plain-syntax"> </span><span class="identifier-syntax">mr</span><span class="plain-syntax"> = </span><a href="../foundation-module/4-pm.html#SP9" class="internal">Regexp::create_mr</a><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/4-pm.html#SP10" class="internal">Regexp::match</a><span class="plain-syntax">(&amp;</span><span class="identifier-syntax">mr</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">within_conditionals</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="string-syntax">"%c*inweb: always predeclare%c*"</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\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">within_conditionals</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]-&gt;</span><span class="element-syntax">text</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">to_close</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::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">-&gt;</span><span class="element-syntax">owning_paragraph</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">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">main_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="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%S "</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_type</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">W</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">main_language</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_name</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;\n"</span><span class="plain-syntax">, </span><span class="identifier-syntax">fn</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">function_arguments</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">L</span><span class="plain-syntax">-&gt;</span><span class="element-syntax">owning_paragraph</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">&lt;</span><span class="identifier-syntax">to_close</span><span class="plain-syntax">; </span><span class="identifier-syntax">i</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">"#endif\n"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> }</span>
</pre><ul class="endnotetexts"><li>This code is used in <a href="4-cl.html#SP6">&#167;6</a>.</li></ul><p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. Overriding regular code weaving. </b>We have the opportunity here to sidestep the regular weaving algorithm, and do
2019-02-04 22:26:45 +00:00
our own thing. We decline.
</p>
2019-03-12 23:32:12 +00:00
<hr class="tocbar">
2020-04-05 17:37:43 +00:00
<ul class="toc"><li><a href="4-tp.html">Back to 'The Painter'</a></li><li><a href="4-is.html">Continue with 'InC Support'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
2019-02-04 22:26:45 +00:00
</body>
</html>