inweb-bootstrap/docs/foundation-module/6-bf.html
2022-03-11 11:15:49 +00:00

472 lines
109 KiB
HTML

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Binary Files</title>
<link href="../docs-assets/Breadcrumbs.css" rel="stylesheet" rev="stylesheet" type="text/css">
<meta name="viewport" content="width=device-width initial-scale=1">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="../docs-assets/Contents.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Progress.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Navigation.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Fonts.css" rel="stylesheet" rev="stylesheet" type="text/css">
<link href="../docs-assets/Base.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
function togglePopup(material_id) {
var popup = document.getElementById(material_id);
popup.classList.toggle("show");
}
</script>
<link href="../docs-assets/Popups.css" rel="stylesheet" rev="stylesheet" type="text/css">
<script>
MathJax = {
tex: {
inlineMath: '$', '$'], ['\\(', '\\)'
},
svg: {
fontCache: 'global'
}
};
</script>
<script type="text/javascript" id="MathJax-script" async
src="https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-svg.js">
</script>
<link href="../docs-assets/Colours.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body class="commentary-font">
<nav role="navigation">
<h1><a href="../index.html">
<img src="../docs-assets/Octagram.png" width=72 height=72">
</a></h1>
<ul><li><a href="../inweb/index.html">inweb</a></li>
</ul><h2>Foundation Module</h2><ul>
<li><a href="index.html"><span class="selectedlink">foundation</span></a></li>
<li><a href="../foundation-test/index.html">foundation-test</a></li>
</ul><h2>Example Webs</h2><ul>
<li><a href="../goldbach/index.html">goldbach</a></li>
<li><a href="../twinprimes/twinprimes.html">twinprimes</a></li>
<li><a href="../eastertide/index.html">eastertide</a></li>
</ul><h2>Repository</h2><ul>
<li><a href="https://github.com/ganelson/inweb"><img src="../docs-assets/github.png" height=18> github</a></li>
</ul><h2>Related Projects</h2><ul>
<li><a href="../../../inform/docs/index.html">inform</a></li>
<li><a href="../../../intest/docs/index.html">intest</a></li>
</ul>
</nav>
<main role="main">
<!--Weave of 'Binary Files' generated by Inweb-->
<div class="breadcrumbs">
<ul class="crumbs"><li><a href="../index.html">Home</a></li><li><a href="index.html">foundation</a></li><li><a href="index.html#6">Chapter 6: Media</a></li><li><b>Binary Files</b></li></ul></div>
<p class="purpose">Routines for reading raw data from binary files.</p>
<ul class="toc"><li><a href="6-bf.html#SP1">&#167;1. Reading binary data</a></li><li><a href="6-bf.html#SP7">&#167;7. Size</a></li><li><a href="6-bf.html#SP8">&#167;8. Opening</a></li><li><a href="6-bf.html#SP9">&#167;9. Copying</a></li><li><a href="6-bf.html#SP10">&#167;10. MD5 hash computation</a></li></ul><hr class="tocbar">
<p class="commentary firstcommentary"><a id="SP1" class="paragraph-anchor"></a><b>&#167;1. Reading binary data. </b>To begin with, integers of 8, 16, 32 and 64 bit widths respectively,
arranged with most significant byte (MSB) first.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_int8</span><button class="popup" onclick="togglePopup('usagePopup1')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup1">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_int8</span></span>:<br/><a href="6-bf.html#SP10">&#167;10</a><br/>Sound Durations - <a href="6-sd.html#SP2">&#167;2</a>, <a href="6-sd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_int16</span><button class="popup" onclick="togglePopup('usagePopup2')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup2">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_int16</span></span>:<br/>Image Dimensions - <a href="6-id.html#SP1">&#167;1</a><br/>Sound Durations - <a href="6-sd.html#SP1">&#167;1</a>, <a href="6-sd.html#SP2">&#167;2</a>, <a href="6-sd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) + ((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_int32</span><button class="popup" onclick="togglePopup('usagePopup3')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup3">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_int32</span></span>:<br/><a href="6-bf.html#SP5">&#167;5</a><br/>Image Dimensions - <a href="6-id.html#SP2">&#167;2</a><br/>Sound Durations - <a href="6-sd.html#SP1">&#167;1</a>, <a href="6-sd.html#SP2">&#167;2</a>, <a href="6-sd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">c4</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c3</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) + ((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">c4</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_int64</span><button class="popup" onclick="togglePopup('usagePopup4')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup4">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_int64</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">c4</span><span class="plain-syntax">, </span><span class="identifier-syntax">c5</span><span class="plain-syntax">, </span><span class="identifier-syntax">c6</span><span class="plain-syntax">, </span><span class="identifier-syntax">c7</span><span class="plain-syntax">, </span><span class="identifier-syntax">c8</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c5</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c6</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c7</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c8</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c5</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span>
<span class="plain-syntax"> || </span><span class="identifier-syntax">c6</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c7</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c8</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c1</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">56</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c2</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">48</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c3</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">40</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c4</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">32</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c5</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c6</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c7</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax">) </span><span class="identifier-syntax">c8</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP2" class="paragraph-anchor"></a><b>&#167;2. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::write_int32</span><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">val</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c3</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) ((</span><span class="identifier-syntax">val</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c4</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">int</span><span class="plain-syntax">) (</span><span class="identifier-syntax">val</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xFF</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c3</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c4</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP3" class="paragraph-anchor"></a><b>&#167;3. </b>We will sometimes need to toggle between MSB and LSB representation of
integers 32 or 64 bits wide:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::swap_bytes32</span><button class="popup" onclick="togglePopup('usagePopup5')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup5">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::swap_bytes32</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff00</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff0000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax"> ) );</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::swap_bytes64</span><button class="popup" onclick="togglePopup('usagePopup6')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup6">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::swap_bytes64</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP2">&#167;2</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">56</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff00</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">40</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff0000</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xff000000</span><span class="plain-syntax">) &lt;&lt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xff000000</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xff0000</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">40</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xff00</span><span class="plain-syntax">) +</span>
<span class="plain-syntax"> ((*</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">56</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0xff</span><span class="plain-syntax">) );</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">value</span><span class="plain-syntax"> = </span><span class="identifier-syntax">result</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP4" class="paragraph-anchor"></a><b>&#167;4. </b>Some file formats also have variable-sized integers, as a sequence of
bytes (most significant first) in which each byte consists of seven bits
of data plus a most significant bit which marks that a continuation byte
follows:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_variable_length_integer</span><button class="popup" onclick="togglePopup('usagePopup7')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup7">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_variable_length_integer</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">do</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (*</span><span class="identifier-syntax">result</span><span class="plain-syntax"> &lt;&lt; </span><span class="constant-syntax">7</span><span class="plain-syntax">) + (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">c</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0x7F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (((</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">char</span><span class="plain-syntax">) </span><span class="identifier-syntax">c</span><span class="plain-syntax">) &amp; </span><span class="constant-syntax">0x80</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP5" class="paragraph-anchor"></a><b>&#167;5. </b>Here we read just the mantissa of a particular representation of
floating-point numbers:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_float80</span><button class="popup" onclick="togglePopup('usagePopup8')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup8">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_float80</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP1">&#167;1</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax">, </span><span class="identifier-syntax">c2</span><span class="plain-syntax">, </span><span class="identifier-syntax">exp</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">mantissa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c1</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> = </span><span class="identifier-syntax">getc</span><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c1</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax"> || </span><span class="identifier-syntax">c2</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (!</span><a href="6-bf.html#SP1" class="function-link"><span class="function-syntax">BinaryFiles::read_int32</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">mantissa</span><span class="plain-syntax">)) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">exp</span><span class="plain-syntax"> = </span><span class="constant-syntax">30</span><span class="plain-syntax"> - </span><span class="identifier-syntax">c2</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">exp</span><span class="plain-syntax">--) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">prev</span><span class="plain-syntax"> = </span><span class="identifier-syntax">mantissa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">mantissa</span><span class="plain-syntax"> &gt;&gt;= </span><span class="constant-syntax">1</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">prev</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">1</span><span class="plain-syntax">) </span><span class="identifier-syntax">mantissa</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> *</span><span class="identifier-syntax">result</span><span class="plain-syntax"> = (</span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax">) </span><span class="identifier-syntax">mantissa</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP6" class="paragraph-anchor"></a><b>&#167;6. </b>And lastly we read a string of a supplied length from the file, and
then null terminate it to make it valid C string. (<span class="extract"><span class="extract-syntax">string</span></span> must therefore
be at least <span class="extract"><span class="extract-syntax">length</span></span> plus 1 bytes long.)
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::read_string</span><button class="popup" onclick="togglePopup('usagePopup9')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup9">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::read_string</span></span>:<br/>Sound Durations - <a href="6-sd.html#SP3">&#167;3</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">, </span><span class="reserved-syntax">char</span><span class="plain-syntax"> *</span><span class="identifier-syntax">string</span><span class="plain-syntax">, </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">length</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">length</span><span class="plain-syntax"> &gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fread</span><span class="plain-syntax">(</span><span class="identifier-syntax">string</span><span class="plain-syntax">, </span><span class="constant-syntax">1</span><span class="plain-syntax">, </span><span class="identifier-syntax">length</span><span class="plain-syntax">, </span><span class="identifier-syntax">binary_file</span><span class="plain-syntax">) != </span><span class="identifier-syntax">length</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">string</span><span class="plain-syntax">[</span><span class="identifier-syntax">length</span><span class="plain-syntax">] = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="constant-syntax">TRUE</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP7" class="paragraph-anchor"></a><b>&#167;7. Size. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::size</span><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax"> = </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::try_to_open_for_reading</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">fseek</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax">, </span><span class="constant-syntax">0</span><span class="plain-syntax">, </span><span class="identifier-syntax">SEEK_END</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">long</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_size</span><span class="plain-syntax"> = </span><span class="identifier-syntax">ftell</span><span class="plain-syntax">(</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">file_size</span><span class="plain-syntax"> == -1</span><span class="identifier-syntax">L</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"ftell failed on linked file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::close</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">file_size</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"fseek failed on linked file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::close</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TEST_FILE</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1</span><span class="identifier-syntax">L</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP8" class="paragraph-anchor"></a><b>&#167;8. Opening. </b></p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryFiles::open_for_reading</span><button class="popup" onclick="togglePopup('usagePopup10')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup10">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::open_for_reading</span></span>:<br/><a href="6-bf.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">handle</span><span class="plain-syntax"> = </span><a href="3-fln.html#SP10" class="function-link"><span class="function-syntax">Filenames::fopen</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="string-syntax">"rb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">handle</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unable to read file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">handle</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryFiles::try_to_open_for_reading</span><button class="popup" onclick="togglePopup('usagePopup11')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup11">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::try_to_open_for_reading</span></span>:<br/><a href="6-bf.html#SP7">&#167;7</a>, <a href="6-bf.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-fln.html#SP10" class="function-link"><span class="function-syntax">Filenames::fopen</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="string-syntax">"rb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryFiles::open_for_writing</span><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">handle</span><span class="plain-syntax"> = </span><a href="3-fln.html#SP10" class="function-link"><span class="function-syntax">Filenames::fopen</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="string-syntax">"wb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">handle</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unable to write file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">handle</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="function-syntax">BinaryFiles::try_to_open_for_writing</span><button class="popup" onclick="togglePopup('usagePopup12')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup12">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::try_to_open_for_writing</span></span>:<br/><a href="6-bf.html#SP9">&#167;9</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><a href="3-fln.html#SP10" class="function-link"><span class="function-syntax">Filenames::fopen</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="string-syntax">"wb"</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::close</span><button class="popup" onclick="togglePopup('usagePopup13')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup13">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::close</span></span>:<br/><a href="6-bf.html#SP7">&#167;7</a>, <a href="6-bf.html#SP9">&#167;9</a>, <a href="6-bf.html#SP10">&#167;10</a></span></button><span class="plain-syntax">(</span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">handle</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">fclose</span><span class="plain-syntax">(</span><span class="identifier-syntax">handle</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP9" class="paragraph-anchor"></a><b>&#167;9. Copying. </b>This achieves a binary copy of a file when we haven't got access to the shell,
or to system APIs.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::copy</span><span class="plain-syntax">(</span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">from</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">to</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">suppress_error</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">from</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) || (</span><span class="identifier-syntax">to</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">))</span>
<span class="plain-syntax"> </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal</span></a><span class="plain-syntax">(</span><span class="string-syntax">"files confused in copier"</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">FROM</span><span class="plain-syntax"> = </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::try_to_open_for_reading</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">FROM</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">suppress_error</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unable to read file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">from</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">TO</span><span class="plain-syntax"> = </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::try_to_open_for_writing</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">TO</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">suppress_error</span><span class="plain-syntax"> == </span><span class="constant-syntax">FALSE</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unable to write to file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">to</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> -1;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="constant-syntax">TRUE</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">c</span><span class="plain-syntax"> = </span><span class="identifier-syntax">fgetc</span><span class="plain-syntax">(</span><span class="identifier-syntax">FROM</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">c</span><span class="plain-syntax"> == </span><span class="identifier-syntax">EOF</span><span class="plain-syntax">) </span><span class="reserved-syntax">break</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">putc</span><span class="plain-syntax">(</span><span class="identifier-syntax">c</span><span class="plain-syntax">, </span><span class="identifier-syntax">TO</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::close</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">FROM</span><span class="plain-syntax">); </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::close</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">TO</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">size</span><span class="plain-syntax">;</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10" class="paragraph-anchor"></a><b>&#167;10. MD5 hash computation. </b>Though now seen as insecure from a cryptographic point of view, Message Digest 5,
a form of checksum created by Ronald Rivest in 1992, remains very useful as a
way to compare files quickly, at least when we're sure nobody is being malicious.
</p>
<p class="commentary">There are thousands of amateur implementations, most of them, like this one,
paraphrased from the pseudocode at the Wikipedia page. The <span class="extract"><span class="extract-syntax">mask</span></span> function allows
certain fixed byte positions in the file to be considered as if they were zero bytes,
which is helpful when testing comparing files whose headers change in uninteresting
ways. If <span class="extract"><span class="extract-syntax">mask</span></span> is <span class="extract"><span class="extract-syntax">NULL</span></span>, or always returns <span class="extract"><span class="extract-syntax">FALSE</span></span>, then the hash computed is
exactly the canonical md5.
</p>
<p class="commentary">The code below is about as enigmatic as a page of well-meaning code can be, but
that's down to the algorithm itself. The <span class="extract"><span class="extract-syntax">K</span></span> array hold bits drawn from the sines
of the integers 1 to 64: sines computed in radians, so that in a sense the md5
algorithm relies on the irrationality of \(\pi\) to make these so unpredictable.
At any rate, the magic numbers below are all drawn from RFC 1321.
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="reserved-syntax">void</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::md5</span><span class="plain-syntax">(</span><span class="constant-syntax">OUTPUT_STREAM</span><span class="plain-syntax">, </span><span class="reserved-syntax">filename</span><span class="plain-syntax"> *</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="reserved-syntax">int</span><span class="plain-syntax"> (*</span><span class="identifier-syntax">mask</span><span class="plain-syntax">)(</span><span class="identifier-syntax">uint64_t</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">s</span><span class="plain-syntax">[64] = {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">7</span><span class="plain-syntax">, </span><span class="constant-syntax">12</span><span class="plain-syntax">, </span><span class="constant-syntax">17</span><span class="plain-syntax">, </span><span class="constant-syntax">22</span><span class="plain-syntax">, </span><span class="constant-syntax">7</span><span class="plain-syntax">, </span><span class="constant-syntax">12</span><span class="plain-syntax">, </span><span class="constant-syntax">17</span><span class="plain-syntax">, </span><span class="constant-syntax">22</span><span class="plain-syntax">, </span><span class="constant-syntax">7</span><span class="plain-syntax">, </span><span class="constant-syntax">12</span><span class="plain-syntax">, </span><span class="constant-syntax">17</span><span class="plain-syntax">, </span><span class="constant-syntax">22</span><span class="plain-syntax">, </span><span class="constant-syntax">7</span><span class="plain-syntax">, </span><span class="constant-syntax">12</span><span class="plain-syntax">, </span><span class="constant-syntax">17</span><span class="plain-syntax">, </span><span class="constant-syntax">22</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">5</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">14</span><span class="plain-syntax">, </span><span class="constant-syntax">20</span><span class="plain-syntax">, </span><span class="constant-syntax">5</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">14</span><span class="plain-syntax">, </span><span class="constant-syntax">20</span><span class="plain-syntax">, </span><span class="constant-syntax">5</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">14</span><span class="plain-syntax">, </span><span class="constant-syntax">20</span><span class="plain-syntax">, </span><span class="constant-syntax">5</span><span class="plain-syntax">, </span><span class="constant-syntax">9</span><span class="plain-syntax">, </span><span class="constant-syntax">14</span><span class="plain-syntax">, </span><span class="constant-syntax">20</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">11</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax">, </span><span class="constant-syntax">23</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">11</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax">, </span><span class="constant-syntax">23</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">11</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax">, </span><span class="constant-syntax">23</span><span class="plain-syntax">, </span><span class="constant-syntax">4</span><span class="plain-syntax">, </span><span class="constant-syntax">11</span><span class="plain-syntax">, </span><span class="constant-syntax">16</span><span class="plain-syntax">, </span><span class="constant-syntax">23</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">6</span><span class="plain-syntax">, </span><span class="constant-syntax">10</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="constant-syntax">21</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">, </span><span class="constant-syntax">10</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="constant-syntax">21</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">, </span><span class="constant-syntax">10</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="constant-syntax">21</span><span class="plain-syntax">, </span><span class="constant-syntax">6</span><span class="plain-syntax">, </span><span class="constant-syntax">10</span><span class="plain-syntax">, </span><span class="constant-syntax">15</span><span class="plain-syntax">, </span><span class="constant-syntax">21</span><span class="plain-syntax"> };</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">K</span><span class="plain-syntax">[64] = {</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xd76aa478</span><span class="plain-syntax">, </span><span class="constant-syntax">0xe8c7b756</span><span class="plain-syntax">, </span><span class="constant-syntax">0x242070db</span><span class="plain-syntax">, </span><span class="constant-syntax">0xc1bdceee</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xf57c0faf</span><span class="plain-syntax">, </span><span class="constant-syntax">0x4787c62a</span><span class="plain-syntax">, </span><span class="constant-syntax">0xa8304613</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfd469501</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x698098d8</span><span class="plain-syntax">, </span><span class="constant-syntax">0x8b44f7af</span><span class="plain-syntax">, </span><span class="constant-syntax">0xffff5bb1</span><span class="plain-syntax">, </span><span class="constant-syntax">0x895cd7be</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x6b901122</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfd987193</span><span class="plain-syntax">, </span><span class="constant-syntax">0xa679438e</span><span class="plain-syntax">, </span><span class="constant-syntax">0x49b40821</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xf61e2562</span><span class="plain-syntax">, </span><span class="constant-syntax">0xc040b</span><span class="identifier-syntax">340</span><span class="plain-syntax">, </span><span class="constant-syntax">0x265e5a51</span><span class="plain-syntax">, </span><span class="constant-syntax">0xe9b6c7aa</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xd62f105d</span><span class="plain-syntax">, </span><span class="constant-syntax">0x02441453</span><span class="plain-syntax">, </span><span class="constant-syntax">0xd8a1e681</span><span class="plain-syntax">, </span><span class="constant-syntax">0xe7d3fbc8</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x21e1cde6</span><span class="plain-syntax">, </span><span class="constant-syntax">0xc33707d6</span><span class="plain-syntax">, </span><span class="constant-syntax">0xf4d50d87</span><span class="plain-syntax">, </span><span class="constant-syntax">0x455a14ed</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xa9e3e905</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfcefa3f8</span><span class="plain-syntax">, </span><span class="constant-syntax">0x676f02d9</span><span class="plain-syntax">, </span><span class="constant-syntax">0x8d2a4c8a</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xfffa3942</span><span class="plain-syntax">, </span><span class="constant-syntax">0x8771f681</span><span class="plain-syntax">, </span><span class="constant-syntax">0x6d9d6122</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfde5380c</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xa4beea44</span><span class="plain-syntax">, </span><span class="constant-syntax">0x4bdecfa9</span><span class="plain-syntax">, </span><span class="constant-syntax">0xf6bb4b60</span><span class="plain-syntax">, </span><span class="constant-syntax">0xbebfbc70</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x289b7ec6</span><span class="plain-syntax">, </span><span class="constant-syntax">0xeaa127fa</span><span class="plain-syntax">, </span><span class="constant-syntax">0xd4ef3085</span><span class="plain-syntax">, </span><span class="constant-syntax">0x04881d05</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xd9d4d039</span><span class="plain-syntax">, </span><span class="constant-syntax">0xe6db99e5</span><span class="plain-syntax">, </span><span class="constant-syntax">0x1fa27cf8</span><span class="plain-syntax">, </span><span class="constant-syntax">0xc4ac5665</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xf4292244</span><span class="plain-syntax">, </span><span class="constant-syntax">0x432aff97</span><span class="plain-syntax">, </span><span class="constant-syntax">0xab9423a7</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfc93a039</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x655b59c3</span><span class="plain-syntax">, </span><span class="constant-syntax">0x8f0ccc92</span><span class="plain-syntax">, </span><span class="constant-syntax">0xffeff47d</span><span class="plain-syntax">, </span><span class="constant-syntax">0x85845dd1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0x6fa87e4f</span><span class="plain-syntax">, </span><span class="constant-syntax">0xfe2ce6e0</span><span class="plain-syntax">, </span><span class="constant-syntax">0xa3014314</span><span class="plain-syntax">, </span><span class="constant-syntax">0x4e0811a1</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="constant-syntax">0xf7537e82</span><span class="plain-syntax">, </span><span class="constant-syntax">0xbd3af235</span><span class="plain-syntax">, </span><span class="constant-syntax">0x2ad7d2bb</span><span class="plain-syntax">, </span><span class="constant-syntax">0xeb86d391</span><span class="plain-syntax"> };</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">a0</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x67452301</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">b0</span><span class="plain-syntax"> = </span><span class="constant-syntax">0xefcdab89</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">c0</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x98badcfe</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">d0</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x10325476</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[64];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">bc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">FILE</span><span class="plain-syntax"> *</span><span class="identifier-syntax">bin</span><span class="plain-syntax"> = </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::open_for_reading</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bin</span><span class="plain-syntax"> == </span><span class="identifier-syntax">NULL</span><span class="plain-syntax">) </span><a href="3-em.html#SP2" class="function-link"><span class="function-syntax">Errors::fatal_with_file</span></a><span class="plain-syntax">(</span><span class="string-syntax">"unable to open binary file"</span><span class="plain-syntax">, </span><span class="identifier-syntax">F</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">unsigned</span><span class="plain-syntax"> </span><span class="reserved-syntax">int</span><span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint64_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><a href="6-bf.html#SP1" class="function-link"><span class="function-syntax">BinaryFiles::read_int8</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bin</span><span class="plain-syntax">, &amp;</span><span class="identifier-syntax">b</span><span class="plain-syntax">)) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">mask</span><span class="plain-syntax">) &amp;&amp; (</span><span class="identifier-syntax">mask</span><span class="plain-syntax">(</span><span class="identifier-syntax">L</span><span class="plain-syntax">))) </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint64_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> = </span><span class="identifier-syntax">L</span><span class="plain-syntax">*8;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">0x80</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">while</span><span class="plain-syntax"> (</span><span class="identifier-syntax">L</span><span class="plain-syntax"> % </span><span class="constant-syntax">64</span><span class="plain-syntax"> != </span><span class="constant-syntax">56</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">L</span><span class="plain-syntax">++;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x00000000000000FF</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x000000000000FF00</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x0000000000FF0000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x00000000FF000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x000000FF00000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">32</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x0000FF0000000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">40</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0x00FF000000000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">48</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">original_length</span><span class="plain-syntax"> &amp; </span><span class="constant-syntax">0xFF00000000000000</span><span class="plain-syntax">) &gt;&gt; </span><span class="constant-syntax">56</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="named-paragraph-container code-font"><a href="6-bf.html#SP10_1" class="named-paragraph-link"><span class="named-paragraph">Process one byte of message</span><span class="named-paragraph-number">10.1</span></a></span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%02x%02x%02x%02x"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">a0</span><span class="plain-syntax"> % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">a0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">a0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">a0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%02x%02x%02x%02x"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b0</span><span class="plain-syntax"> % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">b0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">b0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">b0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%02x%02x%02x%02x"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c0</span><span class="plain-syntax"> % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">c0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">c0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">c0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">WRITE</span><span class="plain-syntax">(</span><span class="string-syntax">"%02x%02x%02x%02x"</span><span class="plain-syntax">,</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">d0</span><span class="plain-syntax"> % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">d0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">8</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">d0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">, (</span><span class="identifier-syntax">d0</span><span class="plain-syntax"> &gt;&gt; </span><span class="constant-syntax">24</span><span class="plain-syntax">) % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><a href="6-bf.html#SP8" class="function-link"><span class="function-syntax">BinaryFiles::close</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">bin</span><span class="plain-syntax">);</span>
<span class="plain-syntax">}</span>
</pre>
<p class="commentary firstcommentary"><a id="SP10_1" class="paragraph-anchor"></a><b>&#167;10.1. </b><span class="named-paragraph-container code-font"><span class="named-paragraph-defn">Process one byte of message</span><span class="named-paragraph-number">10.1</span></span><span class="comment-syntax"> =</span>
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="plain-syntax"> </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[</span><span class="identifier-syntax">bc</span><span class="plain-syntax">++] = (</span><span class="identifier-syntax">b</span><span class="plain-syntax"> % </span><span class="constant-syntax">0x100</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">bc</span><span class="plain-syntax"> == </span><span class="constant-syntax">64</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">bc</span><span class="plain-syntax"> = </span><span class="constant-syntax">0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">M</span><span class="plain-syntax">[16];</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;16; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++)</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">M</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] = </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">*4+3]*</span><span class="constant-syntax">0x1000000</span><span class="plain-syntax"> + </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">*4+2]*</span><span class="constant-syntax">0x10000</span><span class="plain-syntax"> +</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">*4+1]*</span><span class="constant-syntax">0x100</span><span class="plain-syntax"> + </span><span class="identifier-syntax">buffer</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">*4+0];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><span class="identifier-syntax">a0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax"> = </span><span class="identifier-syntax">b0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax"> = </span><span class="identifier-syntax">c0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">d0</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">for</span><span class="plain-syntax"> (</span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">i</span><span class="plain-syntax">=0; </span><span class="identifier-syntax">i</span><span class="plain-syntax">&lt;64; </span><span class="identifier-syntax">i</span><span class="plain-syntax">++) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">g</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">16</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">C</span><span class="plain-syntax">) | ((~ </span><span class="identifier-syntax">B</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">D</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = </span><span class="identifier-syntax">i</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">32</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = (</span><span class="identifier-syntax">D</span><span class="plain-syntax"> &amp; </span><span class="identifier-syntax">B</span><span class="plain-syntax">) | ((~ </span><span class="identifier-syntax">D</span><span class="plain-syntax">) &amp; </span><span class="identifier-syntax">C</span><span class="plain-syntax">);</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = (5*</span><span class="identifier-syntax">i</span><span class="plain-syntax"> + </span><span class="constant-syntax">1</span><span class="plain-syntax">) % </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> (</span><span class="identifier-syntax">i</span><span class="plain-syntax"> &lt; </span><span class="constant-syntax">48</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">B</span><span class="plain-syntax"> ^ </span><span class="identifier-syntax">C</span><span class="plain-syntax"> ^ </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = (3*</span><span class="identifier-syntax">i</span><span class="plain-syntax"> + </span><span class="constant-syntax">5</span><span class="plain-syntax">) % </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> } </span><span class="reserved-syntax">else</span><span class="plain-syntax"> {</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax"> ^ (</span><span class="identifier-syntax">B</span><span class="plain-syntax"> | (~ </span><span class="identifier-syntax">D</span><span class="plain-syntax">));</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">g</span><span class="plain-syntax"> = (7*</span><span class="identifier-syntax">i</span><span class="plain-syntax">) % </span><span class="constant-syntax">16</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">F</span><span class="plain-syntax"> += </span><span class="identifier-syntax">A</span><span class="plain-syntax"> + </span><span class="identifier-syntax">K</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">] + </span><span class="identifier-syntax">M</span><span class="plain-syntax">[</span><span class="identifier-syntax">g</span><span class="plain-syntax">];</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">A</span><span class="plain-syntax"> = </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">D</span><span class="plain-syntax"> = </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">C</span><span class="plain-syntax"> = </span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">B</span><span class="plain-syntax"> = </span><span class="identifier-syntax">B</span><span class="plain-syntax"> + </span><a href="6-bf.html#SP11" class="function-link"><span class="function-syntax">BinaryFiles::rotate</span></a><span class="plain-syntax">(</span><span class="identifier-syntax">F</span><span class="plain-syntax">, </span><span class="identifier-syntax">s</span><span class="plain-syntax">[</span><span class="identifier-syntax">i</span><span class="plain-syntax">]);</span>
<span class="plain-syntax"> }</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">a0</span><span class="plain-syntax"> += </span><span class="identifier-syntax">A</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">b0</span><span class="plain-syntax"> += </span><span class="identifier-syntax">B</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">c0</span><span class="plain-syntax"> += </span><span class="identifier-syntax">C</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="identifier-syntax">d0</span><span class="plain-syntax"> += </span><span class="identifier-syntax">D</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> }</span>
</pre>
<ul class="endnotetexts"><li>This code is used in <a href="6-bf.html#SP10">&#167;10</a> (11 times).</li></ul>
<p class="commentary firstcommentary"><a id="SP11" class="paragraph-anchor"></a><b>&#167;11. </b>This is a C-compiler safe way to rotate a 32-bit unsigned integer left
by <span class="extract"><span class="extract-syntax">shift</span></span> number of bits. Enjoy:
</p>
<pre class="displayed-code all-displayed-code code-font">
<span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="function-syntax">BinaryFiles::rotate</span><button class="popup" onclick="togglePopup('usagePopup14')"><span class="comment-syntax">?</span><span class="popuptext" id="usagePopup14">Usage of <span class="code-font"><span class="function-syntax">BinaryFiles::rotate</span></span>:<br/><a href="6-bf.html#SP10_1">&#167;10.1</a></span></button><span class="plain-syntax">(</span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">value</span><span class="plain-syntax">, </span><span class="identifier-syntax">uint32_t</span><span class="plain-syntax"> </span><span class="identifier-syntax">shift</span><span class="plain-syntax">) {</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">if</span><span class="plain-syntax"> ((</span><span class="identifier-syntax">shift</span><span class="plain-syntax"> &amp;= </span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">)*8 - </span><span class="constant-syntax">1</span><span class="plain-syntax">) == </span><span class="constant-syntax">0</span><span class="plain-syntax">) </span><span class="reserved-syntax">return</span><span class="plain-syntax"> </span><span class="identifier-syntax">value</span><span class="plain-syntax">;</span>
<span class="plain-syntax"> </span><span class="reserved-syntax">return</span><span class="plain-syntax"> (</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &lt;&lt; </span><span class="identifier-syntax">shift</span><span class="plain-syntax">) | (</span><span class="identifier-syntax">value</span><span class="plain-syntax"> &gt;&gt; (</span><span class="reserved-syntax">sizeof</span><span class="plain-syntax">(</span><span class="identifier-syntax">value</span><span class="plain-syntax">)*8 - </span><span class="identifier-syntax">shift</span><span class="plain-syntax">));</span>
<span class="plain-syntax">}</span>
</pre>
<nav role="progress"><div class="progresscontainer">
<ul class="progressbar"><li class="progressprev"><a href="5-ee.html">&#10094;</a></li><li class="progresschapter"><a href="P-abgtf.html">P</a></li><li class="progresschapter"><a href="1-fm.html">1</a></li><li class="progresschapter"><a href="2-dl.html">2</a></li><li class="progresschapter"><a href="3-em.html">3</a></li><li class="progresschapter"><a href="4-chr.html">4</a></li><li class="progresschapter"><a href="5-htm.html">5</a></li><li class="progresscurrentchapter">6</li><li class="progresscurrent">bf</li><li class="progresssection"><a href="6-id.html">id</a></li><li class="progresssection"><a href="6-sd.html">sd</a></li><li class="progresschapter"><a href="7-vn.html">7</a></li><li class="progresschapter"><a href="8-ws.html">8</a></li><li class="progressnext"><a href="6-id.html">&#10095;</a></li></ul></div>
</nav><!--End of weave-->
</main>
</body>
</html>