1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/inbuild-module/2-cps.html
2020-03-26 19:22:26 +00:00

441 lines
72 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>2/edt</title>
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<nav role="navigation">
<h1><a href="../webs.html">Sources</a></h1>
<ul>
<li><a href="../compiler.html"><b>compiler</b></a></li>
<li><a href="../other.html">other tools</a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Compiler Webs</h2>
<ul>
<li><a href="../inbuild/index.html">inbuild</a></li>
<li><a href="../inform7/index.html">inform7</a></li>
<li><a href="../inter/index.html">inter</a></li>
</ul>
<h2>Inbuild Modules</h2>
<ul>
<li><a href="../inbuild-module/index.html">inbuild</a></li>
<li><a href="../arch-module/index.html">arch</a></li>
<li><a href="../words-module/index.html">words</a></li>
<li><a href="../syntax-module/index.html">syntax</a></li>
<li><a href="../html-module/index.html">html</a></li>
</ul>
<h2>Inform7 Modules</h2>
<ul>
<li><a href="../core-module/index.html">core</a></li>
<li><a href="../problems-module/index.html">problems</a></li>
<li><a href="../inflections-module/index.html">inflections</a></li>
<li><a href="../linguistics-module/index.html">linguistics</a></li>
<li><a href="../kinds-module/index.html">kinds</a></li>
<li><a href="../if-module/index.html">if</a></li>
<li><a href="../multimedia-module/index.html">multimedia</a></li>
<li><a href="../index-module/index.html">index</a></li>
</ul>
<h2>Inter Modules</h2>
<ul>
<li><a href="../inter-module/index.html">inter</a></li>
<li><a href="../building-module/index.html">building</a></li>
<li><a href="../codegen-module/index.html">codegen</a></li>
</ul>
<h2>Foundation</h2>
<ul>
<li><a href="../../../inweb/docs/foundation-module/index.html">foundation</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of '2/cps' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../compiler.html">Compiler Modules</a></li><li><a href="index.html">inbuild</a></li><li><a href="index.html#2">Chapter 2: Conceptual Framework</a></li><li><b>Copies</b></li></ul><p class="purpose">A copy is an instance in the file system of a specific edition of a work.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Copies</a></li><li><a href="#SP2">&#167;2. Errors</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Copies. </b>A "copy" of a work exists in the file system when we've actually got hold of
some edition of it. For some genres, copies will be files; for others,
directories holding a set of files.
</p>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> {</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">edition</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">location_if_path</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">location_if_file</span><span class="plain">;</span>
<span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">content</span><span class="plain">; </span> <span class="comment">the type of which depends on the work's genre</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">build_vertex</span><span class="plain"> *</span><span class="identifier">vertex</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">source_text_read</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">source_text</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">linked_list</span><span class="plain"> *</span><span class="identifier">errors_reading_source_text</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_requirement</span><span class="plain"> *</span><span class="identifier">found_by</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">inbuild_copy</span><span class="plain">;</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">Copies::new_p</span><span class="plain">(</span><span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">ref</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">copy</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain">);</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain"> = </span><span class="identifier">edition</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain"> = </span><span class="identifier">ref</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;source_text_read</span><span class="plain"> = </span><span class="identifier">FALSE</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;source_text</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;errors_reading_source_text</span><span class="plain"> = </span><span class="identifier">NEW_LINKED_LIST</span><span class="plain">(</span><span class="reserved">copy_error</span><span class="plain">);</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;found_by</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">copy</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">Copies::new_in_file</span><span class="plain">(</span><span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">, </span><span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">ref</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">copy</span><span class="plain"> = </span><span class="functiontext">Copies::new_p</span><span class="plain">(</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">ref</span><span class="plain">);</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">copy</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">Copies::new_in_path</span><span class="plain">(</span><span class="reserved">inbuild_edition</span><span class="plain"> *</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">ref</span><span class="plain">) {</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">copy</span><span class="plain"> = </span><span class="functiontext">Copies::new_p</span><span class="plain">(</span><span class="identifier">edition</span><span class="plain">, </span><span class="identifier">ref</span><span class="plain">);</span>
<span class="identifier">copy</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain"> = </span><span class="identifier">P</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">copy</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::set_content</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">general_pointer</span><span class="plain"> </span><span class="identifier">ref</span><span class="plain">) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;content</span><span class="plain"> = </span><span class="identifier">ref</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::write_copy</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Editions::write</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::inspect_copy</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="functiontext">Editions::inspect</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::go_operational</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_GO_OPERATIONAL_MTID</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::scan</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_SCAN_COPY_MTID</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::build</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::rebuild</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::show_graph</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">TRUE</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::show_needs</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="functiontext">Graphs::show_needs</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">, </span><span class="identifier">uses_only</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::show_missing</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">uses_only</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="functiontext">Graphs::show_missing</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">, </span><span class="identifier">uses_only</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> == 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Nothing is missing\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::archive</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">inbuild_nest</span><span class="plain"> *</span><span class="identifier">N</span><span class="plain">, </span><span class="reserved">build_methodology</span><span class="plain"> *</span><span class="identifier">BM</span><span class="plain">) {</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_BUILD_COPY_MTID</span><span class="plain">, </span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">NM</span><span class="plain"> = </span><span class="functiontext">Graphs::show_missing</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">, </span><span class="identifier">FALSE</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">NM</span><span class="plain"> &gt; 0) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"Because there are missing resources, -archive is cancelled\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain">) </span><span class="functiontext">Graphs::archive</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;vertex</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">, </span><span class="identifier">BM</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="functiontext">Copies::source_text_has_been_read</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy"</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;source_text_read</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="functiontext">Copies::read_source_text_for</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;source_text_read</span><span class="plain"> == </span><span class="identifier">FALSE</span><span class="plain">) {</span>
<span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;source_text_read</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="identifier">feed_t</span><span class="plain"> </span><span class="identifier">id</span><span class="plain"> = </span><span class="identifier">Feeds::begin</span><span class="plain">();</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">, </span><span class="constant">GENRE_READ_SOURCE_TEXT_FOR_MTID</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="identifier">wording</span><span class="plain"> </span><span class="identifier">W</span><span class="plain"> = </span><span class="identifier">Feeds::end</span><span class="plain">(</span><span class="identifier">id</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Wordings::nonempty</span><span class="plain">(</span><span class="identifier">W</span><span class="plain">)) </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;source_text</span><span class="plain"> = </span><span class="identifier">W</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;source_text</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="functiontext">Copies::claim</span><span class="plain">(</span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">arg</span><span class="plain">) {</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">ext</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain"> = </span><span class="identifier">Str::len</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">) - 1, </span><span class="identifier">dotpos</span><span class="plain"> = -1;</span>
<span class="reserved">while</span><span class="plain"> (</span><span class="identifier">pos</span><span class="plain"> &gt;= 0) {</span>
<span class="identifier">wchar_t</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="identifier">Str::get_at</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">pos</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">) </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">c</span><span class="plain"> == </span><span class="character">'.'</span><span class="plain">) </span><span class="identifier">dotpos</span><span class="plain"> = </span><span class="identifier">pos</span><span class="plain">;</span>
<span class="identifier">pos</span><span class="plain">--;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">dotpos</span><span class="plain"> &gt;= 0)</span>
<span class="identifier">Str::substr</span><span class="plain">(</span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">Str::at</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">dotpos</span><span class="plain">+1), </span><span class="identifier">Str::end</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">));</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">directory_status</span><span class="plain"> = </span><span class="identifier">NOT_APPLICABLE</span><span class="plain">;</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">Str::get_last_char</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">) == </span><span class="identifier">FOLDER_SEPARATOR</span><span class="plain">) {</span>
<span class="identifier">Str::delete_last_character</span><span class="plain">(</span><span class="identifier">arg</span><span class="plain">);</span>
<span class="identifier">directory_status</span><span class="plain"> = </span><span class="identifier">TRUE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">inbuild_genre</span><span class="plain"> *</span><span class="identifier">G</span><span class="plain">;</span>
<span class="identifier">LOOP_OVER</span><span class="plain">(</span><span class="identifier">G</span><span class="plain">, </span><span class="reserved">inbuild_genre</span><span class="plain">)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">)</span>
<span class="identifier">VMETHOD_CALL</span><span class="plain">(</span><span class="identifier">G</span><span class="plain">, </span><span class="constant">GENRE_CLAIM_AS_COPY_MTID</span><span class="plain">, &amp;</span><span class="identifier">C</span><span class="plain">, </span><span class="identifier">arg</span><span class="plain">, </span><span class="identifier">ext</span><span class="plain">, </span><span class="identifier">directory_status</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">ext</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">C</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::inspect</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S: "</span><span class="plain">, </span><span class="functiontext">Genres::name</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;edition</span><span class="plain">-</span><span class="element">&gt;work</span><span class="plain">-</span><span class="element">&gt;genre</span><span class="plain">));</span>
<span class="functiontext">Copies::inspect_copy</span><span class="plain">(</span><span class="identifier">STDOUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" at path %p"</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_path</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">) {</span>
<span class="identifier">pathname</span><span class="plain"> *</span><span class="identifier">P</span><span class="plain"> = </span><span class="identifier">Filenames::get_path_to</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;location_if_file</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">P</span><span class="plain">) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" in directory %p"</span><span class="plain">, </span><span class="identifier">P</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain"> = </span><span class="identifier">LinkedLists::len</span><span class="plain">(</span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;errors_reading_source_text</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">" - %d error"</span><span class="plain">, </span><span class="identifier">N</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt; 1) </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"s"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">N</span><span class="plain"> &gt; 0) {</span>
<span class="identifier">INDENT</span><span class="plain">; </span><span class="functiontext">Copies::list_problems_arising</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">); </span><span class="identifier">OUTDENT</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::new_p appears nowhere else.</p>
<p class="endnote">The function Copies::new_in_file is used in 4/em (<a href="4-em.html#SP5">&#167;5</a>), 4/pfm (<a href="4-pfm.html#SP2">&#167;2</a>), 4/pm (<a href="4-pm.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Copies::new_in_path is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/lm (<a href="4-lm.html#SP4">&#167;4</a>), 4/pbm (<a href="4-pbm.html#SP2">&#167;2</a>), 4/tm (<a href="4-tm.html#SP3">&#167;3</a>).</p>
<p class="endnote">The function Copies::set_content is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Copies::write_copy is used in 3/bg (<a href="3-bg.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Copies::inspect_copy appears nowhere else.</p>
<p class="endnote">The function Copies::go_operational is used in 1/ic (<a href="1-ic.html#SP4">&#167;4</a>).</p>
<p class="endnote">The function Copies::scan is used in 4/km (<a href="4-km.html#SP3">&#167;3</a>), 4/em (<a href="4-em.html#SP5">&#167;5</a>).</p>
<p class="endnote">The function Copies::build appears nowhere else.</p>
<p class="endnote">The function Copies::rebuild appears nowhere else.</p>
<p class="endnote">The function Copies::show_graph appears nowhere else.</p>
<p class="endnote">The function Copies::show_needs appears nowhere else.</p>
<p class="endnote">The function Copies::show_missing appears nowhere else.</p>
<p class="endnote">The function Copies::archive appears nowhere else.</p>
<p class="endnote">The function Copies::source_text_has_been_read is used in 6/inc (<a href="6-inc.html#SP6">&#167;6</a>).</p>
<p class="endnote">The function Copies::read_source_text_for is used in 1/ic (<a href="1-ic.html#SP3">&#167;3</a>), 4/em (<a href="4-em.html#SP9">&#167;9</a>), 5/ed2 (<a href="5-ed2.html#SP3_1">&#167;3.1</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Copies::claim appears nowhere else.</p>
<p class="endnote">The function Copies::inspect appears nowhere else.</p>
<p class="endnote">The structure inbuild_copy is accessed in 1/ic, 2/nst, 3/bg, 3/bs2, 3/is, 3/is2, 3/is3, 3/is4, 4/km, 4/em, 4/lm, 4/pbm, 4/pfm, 4/tm, 4/pm, 5/kts, 5/es, 5/ed, 5/ed2, 5/ec, 5/ps, 5/ls, 6/hdn, 6/inc and here.</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Errors. </b>Copies can sometimes exist in a damaged form: for example, they are purportedly
extension files but have a mangled identification line. Each copy structure
therefore has a list attached of errors which occurred in reading it.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">OPEN_FAILED_CE</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">KIT_MISWORDED_CE</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXT_MISWORDED_CE</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXT_TITLE_TOO_LONG_CE</span>
<span class="definitionkeyword">enum</span> <span class="constant">EXT_AUTHOR_TOO_LONG_CE</span>
<span class="definitionkeyword">enum</span> <span class="constant">LEXER_CE</span>
<span class="definitionkeyword">enum</span> <span class="constant">SYNTAX_CE</span>
</pre>
<pre class="display">
<span class="reserved">typedef</span><span class="plain"> </span><span class="reserved">struct</span><span class="plain"> </span><span class="reserved">copy_error</span><span class="plain"> {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">error_category</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">error_subcategory</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">copy</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">file</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_file_position</span><span class="plain"> </span><span class="identifier">pos</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">notes</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">details</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">details_N</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">wording</span><span class="plain"> </span><span class="identifier">details_W</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">details_node</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="identifier">parse_node</span><span class="plain"> *</span><span class="identifier">details_node2</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">details_work</span><span class="plain">;</span>
<span class="reserved">struct</span><span class="plain"> </span><span class="reserved">inbuild_work</span><span class="plain"> *</span><span class="identifier">details_work2</span><span class="plain">;</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">word</span><span class="plain">;</span>
<span class="identifier">MEMORY_MANAGEMENT</span>
<span class="plain">} </span><span class="reserved">copy_error</span><span class="plain">;</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="functiontext">Copies::new_error</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">, </span><span class="identifier">text_stream</span><span class="plain"> *</span><span class="identifier">NB</span><span class="plain">) {</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="identifier">CREATE</span><span class="plain">(</span><span class="reserved">copy_error</span><span class="plain">);</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;error_category</span><span class="plain"> = </span><span class="identifier">cat</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;error_subcategory</span><span class="plain"> = -1;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;file</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;notes</span><span class="plain"> = </span><span class="identifier">Str::duplicate</span><span class="plain">(</span><span class="identifier">NB</span><span class="plain">);</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_N</span><span class="plain"> = -1;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_W</span><span class="plain"> = </span><span class="identifier">EMPTY_WORDING</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_node</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_node2</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_work</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_work2</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;pos</span><span class="plain"> = </span><span class="identifier">TextFiles::nowhere</span><span class="plain">();</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;word</span><span class="plain"> = </span><span class="identifier">NULL</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="functiontext">Copies::new_error_N</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">, </span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">N</span><span class="plain">) {</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext">Copies::new_error</span><span class="plain">(</span><span class="identifier">cat</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_N</span><span class="plain"> = </span><span class="identifier">N</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="functiontext">Copies::new_error_on_file</span><span class="plain">(</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">cat</span><span class="plain">, </span><span class="identifier">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain"> = </span><span class="functiontext">Copies::new_error</span><span class="plain">(</span><span class="identifier">cat</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;file</span><span class="plain"> = </span><span class="identifier">F</span><span class="plain">;</span>
<span class="reserved">return</span><span class="plain"> </span><span class="identifier">CE</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::attach</span><span class="plain">(</span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">, </span><span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"no copy to attach to"</span><span class="plain">);</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;copy</span><span class="plain"> = </span><span class="identifier">C</span><span class="plain">;</span>
<span class="identifier">ADD_TO_LINKED_LIST</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="reserved">copy_error</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;errors_reading_source_text</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::list_problems_arising</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">inbuild_copy</span><span class="plain"> *</span><span class="identifier">C</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">C</span><span class="plain"> == </span><span class="identifier">NULL</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">;</span>
<span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain">;</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = 1;</span>
<span class="identifier">LOOP_OVER_LINKED_LIST</span><span class="plain">(</span><span class="identifier">CE</span><span class="plain">, </span><span class="reserved">copy_error</span><span class="plain">, </span><span class="identifier">C</span><span class="plain">-</span><span class="element">&gt;errors_reading_source_text</span><span class="plain">) {</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%d. "</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">++); </span><span class="functiontext">Copies::write_problem</span><span class="plain">(</span><span class="identifier">OUT</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">); </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Copies::write_problem</span><span class="plain">(</span><span class="identifier">OUTPUT_STREAM</span><span class="plain">, </span><span class="reserved">copy_error</span><span class="plain"> *</span><span class="identifier">CE</span><span class="plain">) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;error_category</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">OPEN_FAILED_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"unable to open file %f"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;file</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXT_MISWORDED_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension misworded: %S"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;notes</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">KIT_MISWORDED_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"kit has incorrect metadata: %S"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;notes</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXT_TITLE_TOO_LONG_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"title too long: %d characters (max is %d)"</span><span class="plain">,</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_N</span><span class="plain">, </span><span class="constant">MAX_EXTENSION_TITLE_LENGTH</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">EXT_AUTHOR_TOO_LONG_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"author name too long: %d characters (max is %d)"</span><span class="plain">,</span>
<span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;details_N</span><span class="plain">, </span><span class="constant">MAX_EXTENSION_AUTHOR_LENGTH</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">LEXER_CE</span><span class="plain">: </span><span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"%S"</span><span class="plain">, </span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;notes</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">SYNTAX_CE</span><span class="plain">:</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">CE</span><span class="plain">-</span><span class="element">&gt;error_subcategory</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">UnexpectedSemicolon_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"unexpected semicolon in sentence"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ParaEndsInColon_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"paragraph ends with a colon"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SentenceEndsInColon_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"paragraph ends with a colon and full stop"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SentenceEndsInSemicolon_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"paragraph ends with a semicolon and full stop"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SemicolonAfterColon_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"paragraph ends with a colon and semicolon"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">SemicolonAfterStop_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"paragraph ends with a full stop and semicolon"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HeadingOverLine_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading contains a line break"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">HeadingStopsBeforeEndOfLine_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading stops before end of line"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtNoBeginsHere_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has no beginning"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtNoEndsHere_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has no end"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="identifier">ExtSpuriouslyContinues_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension continues after end"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtMultipleBeginsHere_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has multiple 'begins here' sentences"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtBeginsAfterEndsHere_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has a 'begins here' after its 'ends here'"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtEndsWithoutBegins_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has an 'ends here' but no 'begins here'"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtMultipleEndsHere_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has multiple 'ends here' sentences"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BadTitleSentence_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"bibliographic sentence at the start is malformed"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UnknownLanguageElement_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"unrecognised stipulation about Inform language elements"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UnknownVirtualMachine_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"unrecognised stipulation about virtual machine"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UseElementWithdrawn_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"use language element is no longer supported"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">IncludeExtQuoted_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension name should not be double-quoted"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">BogusExtension_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"can't find this extension"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtVersionTooLow_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension version too low"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtVersionMalformed_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension version is malformed"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtInadequateVM_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension is not compatible with the target virtual machine"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">ExtMisidentifiedEnds_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"extension has an 'ends here' but it does not match the 'begins here'"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">HeadingInPlaceOfUnincluded_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading is in place of an extension not included"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">UnequalHeadingInPlaceOf_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading is in place of another heading but of a diffeent level"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">HeadingInPlaceOfSubordinate_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading is in place of another heading subordinate to itself"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">HeadingInPlaceOfUnknown_SYNERROR</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"heading is in place of another heading which doesn't seem to exist'"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">:</span>
<span class="identifier">WRITE</span><span class="plain">(</span><span class="string">"syntax error"</span><span class="plain">); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">default</span><span class="plain">: </span><span class="identifier">internal_error</span><span class="plain">(</span><span class="string">"an unknown error occurred"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Copies::new_error is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>, <a href="5-es.html#SP1_1">&#167;1.1</a>, <a href="5-es.html#SP1_1_3">&#167;1.1.3</a>, <a href="5-es.html#SP1_1_3_2">&#167;1.1.3.2</a>), 5/ps (<a href="5-ps.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP22_1">&#167;22.1</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP22_3">&#167;22.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Copies::new_error_N is used in 5/es (<a href="5-es.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Copies::new_error_on_file is used in 5/es (<a href="5-es.html#SP1_1">&#167;1.1</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>).</p>
<p class="endnote">The function Copies::attach is used in 5/kts (<a href="5-kts.html#SP1">&#167;1</a>), 5/es (<a href="5-es.html#SP1">&#167;1</a>, <a href="5-es.html#SP1_1">&#167;1.1</a>, <a href="5-es.html#SP1_1_3">&#167;1.1.3</a>, <a href="5-es.html#SP1_1_3_2">&#167;1.1.3.2</a>), 5/ps (<a href="5-ps.html#SP6">&#167;6</a>), 6/st (<a href="6-st.html#SP1">&#167;1</a>, <a href="6-st.html#SP2">&#167;2</a>, <a href="6-st.html#SP4">&#167;4</a>, <a href="6-st.html#SP12">&#167;12</a>), 6/hdn (<a href="6-hdn.html#SP12_1">&#167;12.1</a>, <a href="6-hdn.html#SP12_2">&#167;12.2</a>, <a href="6-hdn.html#SP22_1">&#167;22.1</a>, <a href="6-hdn.html#SP23_1">&#167;23.1</a>, <a href="6-hdn.html#SP22_2">&#167;22.2</a>, <a href="6-hdn.html#SP22_3">&#167;22.3</a>), 6/inc (<a href="6-inc.html#SP3_1">&#167;3.1</a>, <a href="6-inc.html#SP6_1_1">&#167;6.1.1</a>, <a href="6-inc.html#SP6_1_2">&#167;6.1.2</a>, <a href="6-inc.html#SP7_1">&#167;7.1</a>, <a href="6-inc.html#SP9_1">&#167;9.1</a>, <a href="6-inc.html#SP11">&#167;11</a>).</p>
<p class="endnote">The function Copies::list_problems_arising is used in <a href="#SP1">&#167;1</a>, 5/ps (<a href="5-ps.html#SP4">&#167;4</a>), 6/inc (<a href="6-inc.html#SP6_1">&#167;6.1</a>).</p>
<p class="endnote">The function Copies::write_problem is used in 5/ec (<a href="5-ec.html#SP5">&#167;5</a>).</p>
<p class="endnote">The structure copy_error is accessed in 2/nst, 3/is, 5/kts, 5/ed2, 5/ec, 5/ps, 6/st, 6/hdn, 6/inc and here.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="2-edt.html">Back to 'Editions'</a></li><li><a href="2-rqr.html">Continue with 'Requirements'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>