1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-05 16:44:21 +03:00
inform7/docs/inblorb/1-bp.html
2020-03-23 21:42:00 +00:00

532 lines
93 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>1/be</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">compiler</a></li>
<li><a href="../other.html"><b>other tools</b></a></li>
<li><a href="../extensions.html">extensions and kits</a></li>
<li><a href="../units.html">unit test tools</a></li>
</ul>
<h2>Other Tools</h2>
<ul>
<li><a href="../inblorb/index.html">inblorb</a></li>
<li><a href="../indoc/index.html">indoc</a></li>
<li><a href="../inpolicy/index.html">inpolicy</a></li>
<li><a href="../inrtps/index.html">inrtps</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 '1/bp' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">Source</a></li><li><a href="../other.html">Other Tools</a></li><li><a href="index.html">inblorb</a></li><li><a href="index.html#1">Chapter 1: Blurbs</a></li><li><b>Blurb Parser</b></li></ul><p class="purpose">Blurb is an interpreted language, and this is the interpreter for it.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Reading the file</a></li><li><a href="#SP6">&#167;6. Summary</a></li><li><a href="#SP7">&#167;7. The interpreter</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Reading the file. </b>We divide the file into blurb commands at line breaks, so:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::parse_blurb_file</span><span class="plain">(</span><span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">F</span><span class="plain">) {</span>
<span class="functiontext">TextFiles::read</span><span class="plain">(</span><span class="identifier">F</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">, </span><span class="string">"can't open blurb file"</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain">, </span><span class="functiontext">Parser::interpret_line</span><span class="plain">, 0, </span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="functiontext">BlorbErrors::set_error_position</span><span class="plain">(</span><span class="identifier">NULL</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Parser::parse_blurb_file is used in 1/mn (<a href="1-mn.html#SP3">&#167;3</a>).</p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. </b>The sequence of values enumerated here must correspond exactly to
indexes into the syntaxes table below.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">author_COMMAND</span><span class="definitionkeyword"> from </span><span class="constant">0</span>
<span class="definitionkeyword">enum</span> <span class="constant">auxiliary_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">base64_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">copyright_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">cover_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">css_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">ifiction_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">ifiction_public_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">ifiction_file_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">interpreter_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">palette_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">palette_16_bit_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">palette_32_bit_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">picture_scaled_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">picture_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">picture_text_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">picture_noid_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">picture_with_alt_text_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">placeholder_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">project_folder_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">release_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">release_file_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">release_file_from_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">release_source_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">release_to_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">resolution_max_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">resolution_min_max_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">resolution_min_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">resolution_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">solution_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">solution_public_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_music_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_repeat_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_forever_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_song_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_text_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_noid_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">sound_with_alt_text_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">source_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">source_public_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">status_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">status_alternative_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">status_instruction_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">storyfile_include_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">storyfile_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">storyfile_leafname_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">template_path_COMMAND</span>
<span class="definitionkeyword">enum</span> <span class="constant">website_COMMAND</span>
</pre>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. </b>A single number specifying various possible combinations of operands. For
example, <code class="display"><span class="extract">NT_OPS</span></code> means "number, text". Clearly the list below is not
exhaustive of the possibilities, but these are the only ones arising for
Blurb commands.
</p>
<pre class="definitions">
<span class="definitionkeyword">enum</span> <span class="constant">VOID_OPS</span><span class="definitionkeyword"> from </span><span class="constant">1</span>
<span class="definitionkeyword">enum</span> <span class="constant">N_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">NN_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">NNN_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">NT_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">NTN_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">NTT_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">T_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">TT_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">TTN_OPS</span>
<span class="definitionkeyword">enum</span> <span class="constant">TTT_OPS</span>
</pre>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. </b>Each legal command syntax is stored as one of these structures.
</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">blurb_command</span><span class="plain"> {</span>
<span class="reserved">char</span><span class="plain"> *</span><span class="identifier">explicated</span><span class="plain">; </span> <span class="comment">plain English form of the command</span>
<span class="identifier">wchar_t</span><span class="plain"> *</span><span class="identifier">prototype</span><span class="plain">; </span> <span class="comment">regular expression prototype</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">operands</span><span class="plain">; </span> <span class="comment">one of the above <code class="display"><span class="extract">*_OPS</span></code> codes</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">deprecated</span><span class="plain">;</span>
<span class="plain">} </span><span class="reserved">blurb_command</span><span class="plain">;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The structure blurb_command is private to this section.</p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. </b>And here they all are. They are tested in the sequence given, and
the sequence must exactly match the numbering of the <code class="display"><span class="extract">*_COMMAND</span></code>
values above, since those are indexes into this table.
</p>
<p class="inwebparagraph">In blurb syntax, a line whose first non-white-space character is an
exclamation mark <code class="display"><span class="extract">!</span></code> is a comment, and is ignored. (This is the I6
comment character, too.) It appears in the table as a command
but, as we shall see, has no effect.
</p>
<pre class="display">
<span class="reserved">blurb_command</span><span class="plain"> </span><span class="identifier">syntaxes</span><span class="plain">[] = {</span>
<span class="plain">{ </span><span class="string">"author \</span><span class="plain">"</span><span class="string">name\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"author \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">description\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">subfolder\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"auxiliary \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TTT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"base64 \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> to \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"base64 \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> to \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"copyright \</span><span class="plain">"</span><span class="string">message\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"copyright \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"cover \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"cover \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"css"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"css"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"ifiction"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ifiction"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"ifiction public"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ifiction public"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"ifiction \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> include"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"ifiction \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> include"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"interpreter \</span><span class="plain">"</span><span class="string">interpreter-name\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">vm-letter\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"interpreter \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">([gz])\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"palette { details }"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"palette {(%c*?)}"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"palette 16 bit"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"palette 16 bit"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"palette 32 bit"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"palette 32 bit"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"picture ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> scale ..."</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"picture (%i+?) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> scale (%c*)"</span><span class="plain">, </span><span class="constant">TTT_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"picture N \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"picture (%d+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">NT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"picture ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"picture (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"picture \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"picture \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"picture N \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">alt-text\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"picture %d \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">NTT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"placeholder [name] = \</span><span class="plain">"</span><span class="string">text\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"placeholder %[(%C+)%] = \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"project folder \</span><span class="plain">"</span><span class="string">pathname\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"project folder \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"release \</span><span class="plain">"</span><span class="string">text\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"release \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"release file \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"release file \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> from \</span><span class="plain">"</span><span class="string">template\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"release file \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> from \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"release source \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> using \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> from \</span><span class="plain">"</span><span class="string">template\</span><span class="plain">"</span><span class="string">"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"release source \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> using \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> from \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TTT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"release to \</span><span class="plain">"</span><span class="string">pathname\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"release to \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"resolution NxN max NxN"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"resolution (%d+) max (%d+)"</span><span class="plain">, </span><span class="constant">NN_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"resolution NxN min NxN max NxN"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"resolution (%d+) min (%d+) max (%d+)"</span><span class="plain">, </span><span class="constant">NNN_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"resolution NxN min NxN"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"resolution (%d+) min (%d+)"</span><span class="plain">, </span><span class="constant">NN_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"resolution NxN"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"resolution (%d+)"</span><span class="plain">, </span><span class="constant">N_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"solution"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"solution"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"solution public"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"solution public"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> music"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> music"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> repeat N"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"sound (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> repeat (%d+)"</span><span class="plain">, </span><span class="constant">TTN_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> repeat forever"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"sound (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> repeat forever"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> song"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> song"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound N \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound (%d+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">NT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound ID \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound (%i+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"sound N \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">alt-text\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"sound (%d+) \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">NTT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"source"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"source"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"source public"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"source public"</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"status \</span><span class="plain">"</span><span class="string">template\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"status \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">TT_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"status alternative ||link to Inform documentation||"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"status alternative ||(%c*)||"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"status instruction ||link to Inform source text||"</span><span class="plain">,</span>
<span class="identifier">L</span><span class="string">"status instruction ||(%c*)||"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string"> include"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string"> include"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">filename\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"storyfile \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">TRUE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"storyfile leafname \</span><span class="plain">"</span><span class="string">leafname\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"storyfile leafname \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"template path \</span><span class="plain">"</span><span class="string">folder\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"template path \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="string">"website \</span><span class="plain">"</span><span class="string">template\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="identifier">L</span><span class="string">"website \</span><span class="plain">"</span><span class="string">(%q*)\</span><span class="plain">"</span><span class="string">"</span><span class="plain">, </span><span class="constant">T_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> },</span>
<span class="plain">{ </span><span class="identifier">NULL</span><span class="plain">, </span><span class="identifier">NULL</span><span class="plain">, </span><span class="constant">VOID_OPS</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain"> }</span>
<span class="plain">};</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP6"></a><b>&#167;6. Summary. </b>For the <code class="display"><span class="extract">-help</span></code> information:
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::summarise_blurb</span><span class="plain">(</span><span class="reserved">void</span><span class="plain">) {</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">The blurbfile is a script of commands, one per line, in these forms:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.prototype</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.deprecated</span><span class="plain"> == </span><span class="constant">FALSE</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" %s\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.explicated</span><span class="plain">);</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"\</span><span class="plain">n</span><span class="string">The following syntaxes, though legal in Blorb 2001, are not supported:\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.prototype</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.deprecated</span><span class="plain"> == </span><span class="constant">TRUE</span><span class="plain">)</span>
<span class="identifier">PRINT</span><span class="plain">(</span><span class="string">" %s\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.explicated</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Parser::summarise_blurb appears nowhere else.</p>
<p class="inwebparagraph"><a id="SP7"></a><b>&#167;7. The interpreter. </b>The following routine is called for each line of the blurb file in sequence,
including any blank lines.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::interpret_line</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">command</span><span class="plain">, </span><span class="reserved">text_file_position</span><span class="plain"> *</span><span class="identifier">tf</span><span class="plain">, </span><span class="reserved">void</span><span class="plain"> *</span><span class="identifier">state</span><span class="plain">) {</span>
<span class="functiontext">BlorbErrors::set_error_position</span><span class="plain">(</span><span class="identifier">tf</span><span class="plain">);</span>
<span class="reserved">match_results</span><span class="plain"> </span><span class="identifier">mr</span><span class="plain"> = </span><span class="functiontext">Regexp::create_mr</span><span class="plain">();</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">L</span><span class="string">" *(%c*?) *"</span><span class="plain">)) </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::len</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) == 0) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">thus skip a line containing only blank space</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::get_first_char</span><span class="plain">(</span><span class="identifier">command</span><span class="plain">) == </span><span class="character">'!'</span><span class="plain">) </span><span class="reserved">return</span><span class="plain">; </span> <span class="comment">thus skip a comment line</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">verbose_mode</span><span class="plain">) </span><span class="identifier">PRINT</span><span class="plain">(</span><span class="string">"! %03d: %S\</span><span class="plain">n</span><span class="string">"</span><span class="plain">, </span><span class="functiontext">TextFiles::get_line_count</span><span class="plain">(</span><span class="identifier">tf</span><span class="plain">), </span><span class="identifier">command</span><span class="plain">);</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">num1</span><span class="plain"> = 0, </span><span class="identifier">num2</span><span class="plain"> = 0, </span><span class="identifier">num3</span><span class="plain"> = 0, </span><span class="identifier">outcome</span><span class="plain"> = -1; </span> <span class="comment">which of the legal command syntaxes is used</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">text3</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Parse the command and set operands appropriately</span> <span class="cwebmacronumber">7.1</span>&gt;<span class="plain">;</span>
&lt;<span class="cwebmacro">Take action on the command</span> <span class="cwebmacronumber">7.2</span>&gt;<span class="plain">;</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">text3</span><span class="plain">);</span>
<span class="functiontext">Regexp::dispose_of</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Parser::interpret_line is used in <a href="#SP1">&#167;1</a>.</p>
<p class="inwebparagraph"><a id="SP7_1"></a><b>&#167;7.1. </b>Here we set <code class="display"><span class="extract">outcome</span></code> to the index in the syntaxes table of the line matched,
or leave it as -1 if no match can be made. Text and number operands are
copied in <code class="display"><span class="extract">text1</span></code>, <code class="display"><span class="extract">num1</span></code>, ..., accordingly.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Parse the command and set operands appropriately</span> <span class="cwebmacronumber">7.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">for</span><span class="plain"> (</span><span class="reserved">int</span><span class="plain"> </span><span class="identifier">t</span><span class="plain">=0; </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.prototype</span><span class="plain">; </span><span class="identifier">t</span><span class="plain">++)</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Regexp::match</span><span class="plain">(&amp;</span><span class="identifier">mr</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">, </span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.prototype</span><span class="plain">)) {</span>
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">t</span><span class="plain">]</span><span class="element">.operands</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">VOID_OPS</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">T_OPS</span><span class="plain">: </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TT_OPS</span><span class="plain">: </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TTN_OPS</span><span class="plain">: </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">N_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NN_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="identifier">num2</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NT_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NTT_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NTN_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="identifier">num2</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">NNN_OPS</span><span class="plain">: </span><span class="identifier">num1</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0], 0);</span>
<span class="identifier">num2</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1], 0);</span>
<span class="identifier">num3</span><span class="plain"> = </span><span class="functiontext">Str::atoi</span><span class="plain">(</span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2], 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">TTT_OPS</span><span class="plain">: </span><span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[0]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[1]);</span>
<span class="functiontext">Str::copy</span><span class="plain">(</span><span class="identifier">text3</span><span class="plain">, </span><span class="identifier">mr</span><span class="element">.exp</span><span class="plain">[2]); </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">"unknown operand type"</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="identifier">outcome</span><span class="plain"> = </span><span class="identifier">t</span><span class="plain">; </span><span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">outcome</span><span class="plain"> == -1) {</span>
<span class="functiontext">BlorbErrors::error_1S</span><span class="plain">(</span><span class="string">"not a valid blurb command"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">outcome</span><span class="plain">]</span><span class="element">.deprecated</span><span class="plain">) {</span>
<span class="functiontext">BlorbErrors::error_1</span><span class="plain">(</span><span class="string">"this Blurb syntax is no longer supported"</span><span class="plain">,</span>
<span class="identifier">syntaxes</span><span class="plain">[</span><span class="identifier">outcome</span><span class="plain">]</span><span class="element">.explicated</span><span class="plain">);</span>
<span class="reserved">return</span><span class="plain">;</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2"></a><b>&#167;7.2. </b>The command is now fully parsed, and is one that we support. We can act.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Take action on the command</span> <span class="cwebmacronumber">7.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">switch</span><span class="plain"> (</span><span class="identifier">outcome</span><span class="plain">) {</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">author_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"AUTHOR"</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, 0);</span>
<span class="functiontext">Writer::author_chunk</span><span class="plain">(</span><span class="identifier">text1</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">auxiliary_COMMAND</span><span class="plain">: </span><span class="functiontext">Links::create_auxiliary_file</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">text3</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">base64_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Requests::request_2</span><span class="plain">(</span><span class="constant">BASE64_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="constant">FALSE</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">copyright_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::copyright_chunk</span><span class="plain">(</span><span class="identifier">text1</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">cover_COMMAND</span><span class="plain">: </span>&lt;<span class="cwebmacro">Declare which file is the cover art</span> <span class="cwebmacronumber">7.2.1</span>&gt;<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">css_COMMAND</span><span class="plain">: </span><span class="identifier">use_css_code_styles</span><span class="plain"> = </span><span class="constant">TRUE</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">ifiction_file_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::metadata_chunk</span><span class="plain">(</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">ifiction_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">IFICTION_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">TRUE</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">ifiction_public_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">IFICTION_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">FALSE</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">interpreter_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"INTERPRETERVMIS"</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, 0);</span>
<span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">INTERPRETER_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="constant">FALSE</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">picture_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::picture_chunk</span><span class="plain">(</span><span class="identifier">num1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">), </span><span class="identifier">I</span><span class="string">""</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">picture_text_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::picture_chunk_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text2</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">picture_noid_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::picture_chunk_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">picture_with_alt_text_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::picture_chunk</span><span class="plain">(</span><span class="identifier">num1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">), </span><span class="identifier">text2</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">placeholder_COMMAND</span><span class="plain">: </span><span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">project_folder_COMMAND</span><span class="plain">: </span><span class="identifier">project_folder</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">release_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Placeholders::set_to_number</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"RELEASE"</span><span class="plain">, </span><span class="identifier">num1</span><span class="plain">);</span>
<span class="functiontext">Writer::release_chunk</span><span class="plain">(</span><span class="identifier">num1</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">release_file_COMMAND</span><span class="plain">: {</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">to_release</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">, </span><span class="string">"%S"</span><span class="plain">, </span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">to_release</span><span class="plain">));</span>
<span class="functiontext">Requests::request_3</span><span class="plain">(</span><span class="constant">COPY_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">leaf</span><span class="plain">, </span><span class="identifier">I</span><span class="string">"--"</span><span class="plain">, </span><span class="constant">FALSE</span><span class="plain">);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">leaf</span><span class="plain">);</span>
<span class="reserved">break</span><span class="plain">;</span>
<span class="plain">}</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">release_file_from_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Requests::request_2</span><span class="plain">(</span><span class="constant">RELEASE_FILE_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="constant">FALSE</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">release_to_COMMAND</span><span class="plain">:</span>
<span class="identifier">release_folder</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
&lt;<span class="cwebmacro">Make pathname placeholders in three different formats</span> <span class="cwebmacronumber">7.2.2</span>&gt;<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">release_source_COMMAND</span><span class="plain">:</span>
<span class="functiontext">Requests::request_3</span><span class="plain">(</span><span class="constant">RELEASE_SOURCE_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="identifier">text2</span><span class="plain">, </span><span class="identifier">text3</span><span class="plain">, </span><span class="constant">FALSE</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">solution_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">SOLUTION_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">TRUE</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">solution_public_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">SOLUTION_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">FALSE</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">sound_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::sound_chunk</span><span class="plain">(</span><span class="identifier">num1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">), </span><span class="identifier">I</span><span class="string">""</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">sound_text_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::sound_chunk_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text2</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">sound_noid_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::sound_chunk_text</span><span class="plain">(</span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">sound_with_alt_text_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::sound_chunk</span><span class="plain">(</span><span class="identifier">num1</span><span class="plain">, </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">), </span><span class="identifier">text2</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">source_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">SOURCE_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">TRUE</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">source_public_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">SOURCE_REQ</span><span class="plain">, </span><span class="identifier">I</span><span class="string">""</span><span class="plain">, </span><span class="constant">FALSE</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">status_COMMAND</span><span class="plain">:</span>
<span class="identifier">status_template</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="identifier">status_file</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text2</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">status_alternative_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">ALTERNATIVE_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="constant">FALSE</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">status_instruction_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">INSTRUCTION_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="constant">FALSE</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">storyfile_include_COMMAND</span><span class="plain">: </span><span class="functiontext">Writer::executable_chunk</span><span class="plain">(</span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">storyfile_leafname_COMMAND</span><span class="plain">: </span><span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"STORYFILE"</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, 0); </span><span class="reserved">break</span><span class="plain">;</span>
<span class="reserved">case</span><span class="plain"> </span><span class="constant">template_path_COMMAND</span><span class="plain">: </span><span class="functiontext">Templates::new_path</span><span class="plain">(</span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">text1</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">website_COMMAND</span><span class="plain">: </span><span class="functiontext">Requests::request_1</span><span class="plain">(</span><span class="constant">WEBSITE_REQ</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, </span><span class="constant">FALSE</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="functiontext">BlorbErrors::error_1S</span><span class="plain">(</span><span class="string">"***"</span><span class="plain">, </span><span class="identifier">command</span><span class="plain">); </span><span class="functiontext">BlorbErrors::fatal</span><span class="plain">(</span><span class="string">"*** command unimplemented ***\</span><span class="plain">n</span><span class="string">"</span><span class="plain">);</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7">&#167;7</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_1"></a><b>&#167;7.2.1. </b>We only ever set the frontispiece as resource number 1, since Inform
has the assumption that the cover art is image number 1 built in.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Declare which file is the cover art</span> <span class="cwebmacronumber">7.2.1</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"BIGCOVER"</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, 0);</span>
<span class="identifier">cover_exists</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="identifier">cover_is_in_JPEG_format</span><span class="plain"> = </span><span class="constant">FALSE</span><span class="plain">;</span>
<span class="reserved">filename</span><span class="plain"> *</span><span class="identifier">cover_filename</span><span class="plain"> = </span><span class="functiontext">Filenames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Filenames::guess_format</span><span class="plain">(</span><span class="identifier">cover_filename</span><span class="plain">) == </span><span class="constant">FORMAT_PERHAPS_JPEG</span><span class="plain">)</span>
<span class="identifier">cover_is_in_JPEG_format</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Writer::frontispiece_chunk</span><span class="plain">(1);</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="functiontext">Str::eq_wide_string</span><span class="plain">(</span><span class="functiontext">Filenames::get_leafname</span><span class="plain">(</span><span class="identifier">cover_filename</span><span class="plain">), </span><span class="identifier">L</span><span class="string">"DefaultCover.jpg"</span><span class="plain">))</span>
<span class="identifier">default_cover_used</span><span class="plain"> = </span><span class="constant">TRUE</span><span class="plain">;</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"SMALLCOVER"</span><span class="plain">, </span><span class="identifier">text1</span><span class="plain">, 0);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2">&#167;7.2</a>.</p>
<p class="inwebparagraph"><a id="SP7_2_2"></a><b>&#167;7.2.2. </b>Here, <code class="display"><span class="extract">text1</span></code> is the pathname of the Release folder. If we suppose that
Inblorb is being run from Inform, then this folder is a subfolder of the
Materials folder for an I7 project. It follows that we can obtain the
pathname to the Materials folder by trimming the leaf and the final separator.
That makes the <code class="display"><span class="extract">MATERIALSFOLDERPATH</span></code> placeholder. We then set <code class="display"><span class="extract">MATERIALSFOLDER</span></code>
to the name of the Materials folder, e.g., "Spaceman Spiff Materials".
</p>
<p class="inwebparagraph">However, we also need two variants on the pathname, one to be supplied to the
Javascript function <code class="display"><span class="extract">openUrl</span></code> and one to <code class="display"><span class="extract">fileUrl</span></code>. For platform dependency
reasons these need to be manipulated to deal with awkward characters.
</p>
<p class="macrodefinition"><code class="display">
&lt;<span class="cwebmacrodefn">Make pathname placeholders in three different formats</span> <span class="cwebmacronumber">7.2.2</span>&gt; =
</code></p>
<pre class="displaydefn">
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">Release</span><span class="plain"> = </span><span class="functiontext">Pathnames::from_text</span><span class="plain">(</span><span class="identifier">text1</span><span class="plain">);</span>
<span class="reserved">pathname</span><span class="plain"> *</span><span class="identifier">Materials</span><span class="plain"> = </span><span class="functiontext">Pathnames::up</span><span class="plain">(</span><span class="identifier">Release</span><span class="plain">);</span>
<span class="identifier">TEMPORARY_TEXT</span><span class="plain">(</span><span class="identifier">as_txt</span><span class="plain">);</span>
<span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">as_txt</span><span class="plain">, </span><span class="string">"%p"</span><span class="plain">, </span><span class="identifier">Materials</span><span class="plain">);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"MATERIALSFOLDERPATH"</span><span class="plain">, </span><span class="identifier">as_txt</span><span class="plain">, 0);</span>
<span class="identifier">DISCARD_TEXT</span><span class="plain">(</span><span class="identifier">as_txt</span><span class="plain">);</span>
<span class="functiontext">Placeholders::set_to</span><span class="plain">(</span><span class="identifier">I</span><span class="string">"MATERIALSFOLDER"</span><span class="plain">,</span>
<span class="functiontext">Pathnames::directory_name</span><span class="plain">(</span><span class="identifier">Materials</span><span class="plain">), 0);</span>
<span class="functiontext">Parser::qualify_placeholder</span><span class="plain">(</span>
<span class="identifier">I</span><span class="string">"MATERIALSFOLDERPATHOPEN"</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"MATERIALSFOLDERPATHFILE"</span><span class="plain">,</span>
<span class="identifier">I</span><span class="string">"MATERIALSFOLDERPATH"</span><span class="plain">);</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">This code is used in <a href="#SP7_2">&#167;7.2</a>.</p>
<p class="inwebparagraph"><a id="SP8"></a><b>&#167;8. </b>And here that very "qualification" routine. The placeholder <code class="display"><span class="extract">original</span></code> contains
the pathname to a folder, a pathname which might contain spaces or backslashes,
and which needs to be quoted as a literal Javascript string supplied to
either the function <code class="display"><span class="extract">openUrl</span></code> or the function <code class="display"><span class="extract">fileUrl</span></code>. Depending on the
platform in use, this may entail escaping spaces or reversing slashes in the
pathname in order to make versions for these two functions to use.
</p>
<pre class="display">
<span class="reserved">void</span><span class="plain"> </span><span class="functiontext">Parser::qualify_placeholder</span><span class="plain">(</span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">openUrl_path</span><span class="plain">, </span><span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">fileUrl_path</span><span class="plain">,</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">original</span><span class="plain">) {</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">OU</span><span class="plain"> = </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">openUrl_path</span><span class="plain">);</span>
<span class="reserved">text_stream</span><span class="plain"> *</span><span class="identifier">FU</span><span class="plain"> = </span><span class="functiontext">Placeholders::read</span><span class="plain">(</span><span class="identifier">fileUrl_path</span><span class="plain">);</span>
<span class="identifier">LOOP_THROUGH_TEXT</span><span class="plain">(</span><span class="identifier">P</span><span class="plain">, </span><span class="identifier">original</span><span class="plain">) {</span>
<span class="reserved">int</span><span class="plain"> </span><span class="identifier">c</span><span class="plain"> = </span><span class="functiontext">Str::get</span><span class="plain">(</span><span class="identifier">P</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="reserved">if</span><span class="plain"> (</span><span class="identifier">escape_openUrl</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">OU</span><span class="plain">, </span><span class="string">"%%2520"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">OU</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">escape_fileUrl</span><span class="plain">) </span><span class="identifier">WRITE_TO</span><span class="plain">(</span><span class="identifier">FU</span><span class="plain">, </span><span class="string">"%%2520"</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">FU</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</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">c</span><span class="plain"> == </span><span class="character">'\</span><span class="plain">\</span><span class="character">'</span><span class="plain">) {</span>
<span class="reserved">if</span><span class="plain"> (</span><span class="identifier">reverse_slash_openUrl</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">OU</span><span class="plain">, </span><span class="character">'/'</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">OU</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">reverse_slash_fileUrl</span><span class="plain">) </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">FU</span><span class="plain">, </span><span class="character">'/'</span><span class="plain">);</span>
<span class="reserved">else</span><span class="plain"> </span><span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">FU</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">} </span><span class="reserved">else</span><span class="plain"> {</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">OU</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="identifier">PUT_TO</span><span class="plain">(</span><span class="identifier">FU</span><span class="plain">, </span><span class="identifier">c</span><span class="plain">);</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
</pre>
<p class="inwebparagraph"></p>
<p class="endnote">The function Parser::qualify_placeholder is used in <a href="#SP7_2_2">&#167;7.2.2</a>.</p>
<hr class="tocbar">
<ul class="toc"><li><a href="1-be.html">Back to 'Blorb Errors'</a></li><li><i>(This section ends Chapter 1: Blurbs.)</i></li></ul><hr class="tocbar">
<!--End of weave-->
</main>
</body>
</html>