A typo in markdown meant that a link was not formed. Renamed enigma.html to enigma.txt. Although it was to be set to viewed as text the problem is that as a html file running a linter on it will cause errors (obviously). The .entry.json and all files that referred to the file enigma.html (not in remote web servers, obviously, but just this website) now refer to enigma.txt, except that enigma.html was now added to .gitignore and the recode.md (in the example command) redirects to enigma.html as that should be a html file, assuming they have the right key (of the selection I gave). These problems were not discovered due to trying to get the html files in a good state (ironically) and knowing that I had written a lot. I believe now that the files should be okay. Although I did use sgit I did it carefully and I still ran make quick-readme2index and make gen_other_html.
1016 lines
41 KiB
HTML
1016 lines
41 KiB
HTML
<!DOCTYPE html>
|
||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||
<!-- START: two lines up starts content from: inc/top.default.html -->
|
||
|
||
<!-- END: this line ends content from: inc/top.default.html -->
|
||
<!-- START: this line starts content from: inc/head.default.html -->
|
||
|
||
<head>
|
||
<link rel="stylesheet" href="../../ioccc.css">
|
||
<link href="https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap" rel="stylesheet">
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes">
|
||
<title>The International Obfuscated C Code Contest</title>
|
||
<link rel="icon" type="image/x-icon" href="../../favicon.ico">
|
||
<meta name="description" content="recode.md for 2020/ferguson2">
|
||
<meta name="keywords" content="IOCCC, 2020/ferguson2, recode.md">
|
||
</head>
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!! DO NOT MODIFY THIS FILE - This file is generated by a tool !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- END: this line ends content from: inc/head.default.html -->
|
||
|
||
<!-- -->
|
||
<!-- This web page was formed via the tool: bin/gen-other-html.sh -->
|
||
<!-- The content of main section of this web page came from: 2020/ferguson2/recode.md -->
|
||
<!-- -->
|
||
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!! Do not modify this web page, instead modify the file: 2020/ferguson2/recode.md !!! -->
|
||
<!-- !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! -->
|
||
|
||
<!-- Markdown content was converted into HTML via the tool: bin/md2html.sh -->
|
||
|
||
<!-- START: this line starts content from: inc/body.default.html -->
|
||
|
||
<body>
|
||
|
||
<!-- END: this line ends content from: inc/body.default.html -->
|
||
<!-- START: this line starts content from: inc/topbar.default.html -->
|
||
|
||
<div class="theader">
|
||
<nav class="topbar">
|
||
<div class="container">
|
||
<div class="logo">
|
||
<a href="../../index.html" class="logo-link">
|
||
IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="topbar-items">
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Entries
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../years.html" class="sub-item-link">
|
||
Winning entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../authors.html" class="sub-item-link">
|
||
Winning authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../location.html" class="sub-item-link">
|
||
Location of authors
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../bugs.html" class="sub-item-link">
|
||
Bugs and (mis)features
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_an_entry" class="sub-item-link">
|
||
Fixing entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#fix_author" class="sub-item-link">
|
||
Updating author info
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
Status
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../news.html" class="sub-item-link">
|
||
News
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../status.html" class="sub-item-link">
|
||
Contest status
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../next/index.html" class="sub-item-link">
|
||
Rules and guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../markdown.html" class="sub-item-link">
|
||
Markdown guidelines
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../SECURITY.html" class="sub-item-link">
|
||
Security policy
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
FAQ
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html" class="sub-item-link">
|
||
Frequently Asked Questions
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#submit" class="sub-item-link">
|
||
How to enter
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#compiling" class="sub-item-link">
|
||
Compiling entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#running_entries" class="sub-item-link">
|
||
Running entries
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../faq.html#help" class="sub-item-link">
|
||
How to help
|
||
</a>
|
||
</div>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="item">
|
||
<span class="item-header">
|
||
About
|
||
</span>
|
||
|
||
<div class="sub-item">
|
||
<div class="outfit-font">
|
||
<a href="../../index.html" class="sub-item-link">
|
||
Home page
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../about.html" class="sub-item-link">
|
||
About the IOCCC
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../judges.html" class="sub-item-link">
|
||
The Judges
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../thanks-for-help.html" class="sub-item-link">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
|
||
<div class="outfit-font">
|
||
<a href="../../contact.html" class="sub-item-link">
|
||
Contact us
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</nav>
|
||
|
||
<div class="header-mobile-menu">
|
||
<noscript>
|
||
<a href="../../nojs-menu.html" class="topbar-js-label">
|
||
Please Enable JavaScript
|
||
</a>
|
||
</noscript>
|
||
|
||
<button id="header-open-menu-button" class="topbar-mobile-menu">
|
||
<img
|
||
src="../../png/hamburger-icon-open.png"
|
||
alt="hamburger style menu icon - open state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<button id="header-close-menu-button" class="hide-content">
|
||
<img
|
||
src="../../png/hamburger-icon-closed.png"
|
||
alt="hamburger style menu icon - closed state"
|
||
width=48
|
||
height=48>
|
||
</button>
|
||
|
||
<div id="mobile-menu-panel" class="hide-content">
|
||
<div class="mobile-menu-container">
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
Entries
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../years.html">
|
||
Winning entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../authors.html">
|
||
Winning authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../location.html">
|
||
Location of authors
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../bugs.html">
|
||
Bugs and (mis)features
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_an_entry">
|
||
Fixing entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#fix_author">
|
||
Updating author info
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../thanks-for-help.html">
|
||
Thanks for the help
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
|
||
<div class="mobile-menu-item">
|
||
Status
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../news.html">
|
||
News
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../status.html">
|
||
Contest status
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../next/index.html">
|
||
Rules and guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../markdown.html">
|
||
Markdown guidelines
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../SECURITY.html">
|
||
Security policy
|
||
</a>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
FAQ
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html">
|
||
Frequently Asked Questions
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#submit">
|
||
How to enter
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#compiling">
|
||
Compiling entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#running_entries">
|
||
Running entries
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../faq.html#help">
|
||
How to help
|
||
</a>
|
||
|
||
</div>
|
||
</div>
|
||
|
||
<div class="mobile-menu-wrapper">
|
||
<div class="mobile-menu-item">
|
||
About
|
||
</div>
|
||
<div class="mobile-submenu-wrapper">
|
||
|
||
<a class="mobile-submenu-item" href="../../index.html">
|
||
Home page
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../about.html">
|
||
About the IOCCC
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../judges.html">
|
||
The Judges
|
||
</a>
|
||
|
||
<a class="mobile-submenu-item" href="../../contact.html">
|
||
Contact us
|
||
</a>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<script>
|
||
var headerOpenMenuButton = document.getElementById("header-open-menu-button");
|
||
var headerCloseMenuButton = document.getElementById("header-close-menu-button");
|
||
var mobileMenuPanel = document.getElementById("mobile-menu-panel");
|
||
|
||
headerOpenMenuButton.addEventListener("click", () => {
|
||
headerOpenMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.add("hide-content");
|
||
|
||
headerCloseMenuButton.classList.remove("hide-content");
|
||
headerCloseMenuButton.classList.add("topbar-mobile-menu");
|
||
|
||
mobileMenuPanel.classList.remove("hide-content");
|
||
mobileMenuPanel.classList.add("topbar-mobile-panel");
|
||
});
|
||
|
||
headerCloseMenuButton.addEventListener("click", () => {
|
||
headerCloseMenuButton.classList.remove("topbar-mobile-menu");
|
||
headerCloseMenuButton.classList.add("hide-content");
|
||
|
||
mobileMenuPanel.classList.add("hide-content");
|
||
mobileMenuPanel.classList.remove("topbar-mobile-panel");
|
||
|
||
headerOpenMenuButton.classList.add("topbar-mobile-menu");
|
||
headerOpenMenuButton.classList.remove("hide-content");
|
||
});
|
||
</script>
|
||
|
||
<!-- END: this line ends content from: inc/topbar.default.html -->
|
||
<!-- START: this line starts content from: inc/header.default.html -->
|
||
|
||
<div class="header">
|
||
<a href="../../2011/zucker/index.html">
|
||
<img src="../../png/ioccc.png"
|
||
alt="IOCCC image by Matt Zucker"
|
||
width=300
|
||
height=110>
|
||
</a>
|
||
<h1>The International Obfuscated C Code Contest</h1>
|
||
<h2>recode.html for 2020/ferguson2</h2>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/header.default.html -->
|
||
<!-- START: this line starts content from: inc/navbar.up2index.html -->
|
||
|
||
<div class="navbar">
|
||
<a class="Left" href="index.html">↑ jump to 2020/ferguson2/index.html ↑</a>
|
||
<a class="Right" href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2020%2Fferguson2%2Frecode.html">✓</a>
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/navbar.up2index.html -->
|
||
<!-- START: this line starts content from: inc/before-content.default.html -->
|
||
|
||
<div class="content" id="content">
|
||
|
||
<!-- END: this line ends content from: inc/before-content.default.html -->
|
||
<!-- START: this line starts content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
|
||
<!-- BEFORE: 1st line of markdown file: 2020/ferguson2/recode.md -->
|
||
<h1 id="the-recode-configurator-documentation-and-a-fun-way-to-explore-my-2020-ioccc-enigma-simulator">The recode configurator documentation (and a fun way to explore my 2020 IOCCC Enigma simulator)</h1>
|
||
<p>N.B. At the end of this file I have given a fun exercise that can be used to
|
||
explore my <a href="https://www.cryptomuseum.com/crypto/enigma/index.htm">Enigma machine</a>
|
||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">simulator</a>. I really encourage you to do this but of course you don’t
|
||
have to if you don’t wish to.</p>
|
||
<div id="toc">
|
||
<ul>
|
||
<li><a href="#recode">What is recode and why is it recommended?</a></li>
|
||
<li><a href="#options">Options</a>
|
||
<ul>
|
||
<li><a href="#samefile">Protecting against the same I/O file</a></li>
|
||
<li><a href="#fileoptions">File options parser limitation</a></li>
|
||
<li><a href="#validation"><code>-R</code> option validation?</a></li>
|
||
</ul></li>
|
||
<li><a href="#pipingtorecode">Piping commands to recode</a></li>
|
||
<li><a href="#pipingtoenigma">Piping recode to the Enigma simulator</a></li>
|
||
<li><a href="#manuallytest">Manually test the recode program with the Enigma program</a></li>
|
||
<li><a href="#onlyconfig">Only write config file</a></li>
|
||
<li><a href="#reuseconfig">Reusing a configuration</a></li>
|
||
<li><a href="#passtoenigma">Write config file, read data file and pass to Enigma simulator</a></li>
|
||
<li><a href="#directlytoenigma">Piping directly to the Enigma code once (with randomised settings, saved)</a></li>
|
||
<li><a href="#conclusion">Usage conclusion</a></li>
|
||
<li><a href="#additions">Example additions</a></li>
|
||
<li><a href="#exampleuses">Example uses</a></li>
|
||
<li><a href="#fun">A fun way to explore my Enigma machine, with a surprise</a></li>
|
||
</ul>
|
||
</div>
|
||
<div id="recode">
|
||
<h1 id="what-is-recode-and-why-is-it-recommended"><a href="#toc">What is recode and why is it recommended?</a></h1>
|
||
</div>
|
||
<p>To demonstrate how to and why you should use the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> program with
|
||
the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">Enigma machine simulator</a> I have included some examples here as
|
||
well as brief (‘brief?!’ I am sure many would think but it’s brief for me)
|
||
commentary.</p>
|
||
<p>It would not be possible to do all that the recode program does in my entry
|
||
itself but I wanted to demonstrate the features of my entry and this seemed the
|
||
best way to do that. It also enhances the use of the simulator to make it
|
||
reusable etc.</p>
|
||
<p>The recode name idea is that it recodes the input (validating first) to be input
|
||
for the simulator itself. It can pseudo-randomly select all the settings, it can
|
||
write the settings to a file, read from input file (e.g. for the text to
|
||
encipher/decipher if piped to the simulator) etc.</p>
|
||
<p>Basically it’s a configurator for the Enigma simulator that makes it easier to
|
||
use the simulator as well as to reuse the configuration to decipher messages
|
||
that have been enciphered by those settings. But it also tries to make it look
|
||
more like the real thing in that it shows the actual rotors (e.g. labelling them
|
||
with the Roman numeral, showing their actual orders etc.), the reflectors
|
||
(labelling them with B, C and showing the actual strings) etc.</p>
|
||
<p>In this file I will show an example of each feature and then get to the
|
||
wonderful ‘challenge’ for everyone.</p>
|
||
<h1 id="options"><a href="#toc">Options</a></h1>
|
||
<pre><code> ./recode -h
|
||
usage: ./recode [options]
|
||
-v display selected settings
|
||
-r pseudo-randomly select settings
|
||
-f<input file> read file for Enigma input
|
||
-R<string|file> init settings from settings string or file
|
||
-o<output file> write settings to file</code></pre>
|
||
<p><code>-r</code> randomises settings. It won’t prompt you for settings but it will for input
|
||
if you don’t give the option to read in a file for input.</p>
|
||
<p><code>-v</code> shows selected settings. For example combining <code>-r</code> and <code>-v</code>:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -r -v
|
||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
Ring 2: ( V) VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Ring 3: ( IV) ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
Ring settings: WAR
|
||
Ring positions: XKE
|
||
Reflector: (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
Plugboard pair #01: XE
|
||
Plugboard pair #02: HJ
|
||
Plugboard pair #03: SA
|
||
Plugboard pair #04: PY
|
||
Plugboard pair #05: CI
|
||
Plugboard pair #06: ZB
|
||
Plugboard pair #07: WD
|
||
Plugboard pair #08: QN
|
||
Plugboard pair #09: RU
|
||
Plugboard pair #10: VG
|
||
1WX5AK4RE1XEHJSAPYCIZBWDQNRUVGIOCCC</code></pre>
|
||
<p>Though you won’t find some of those strings in <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> or
|
||
<a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">prog.c</a>. Yes the <code>WAR</code> for the Ringstellung (Ring settings) is an
|
||
amusing coincidence <em>but it really did happen!</em></p>
|
||
<p>As for <code>-f</code> the contents would be output with the settings e.g. to pipe to
|
||
<code>prog</code> itself (as if you redirected the file contents to the Enigma machine for
|
||
encipherment/decipherment). If the file cannot be opened it sets back to stdin.</p>
|
||
<p><code>-o</code> outputs the settings to the file. If the file cannot be opened for writing
|
||
or is the same file name (see below) then only stdout will be used. Example of
|
||
randomised output going to a file:</p>
|
||
<pre><code> $ ./recode -r -oconfig
|
||
IOCCC
|
||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSDIOCCC
|
||
$ cat config
|
||
3PP4UB5GG1ELGTKFCOPVBNUYXJAWSD$</code></pre>
|
||
<p>Notice that a terminating newline isn’t added. Also note that it outputs to
|
||
stdout so you can pipe it to the Enigma machine but at the same time have the
|
||
settings saved for deciphering the text later (the configuration does not have
|
||
the input but both the configuration and the input text is printed to stdout).</p>
|
||
<p>If you want to initialise the settings from previously saved settings (as a
|
||
string or an input file that has the same format) use the <code>-R<settings></code> option.
|
||
Again note that this does not validate input! Although it detects out of range
|
||
for the arrays it doesn’t detect duplicates. This is because it wasn’t meant to
|
||
be any given file or anything else other than the direct output of a previous
|
||
run (thus validated). I’m not even guaranteeing that I got the array tests valid
|
||
in <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/recode.c">recode.c</a> <code>-R</code> option!</p>
|
||
<div id="samefile">
|
||
<h2 id="protecting-against-the-same-io-file"><a href="#toc">Protecting against the same I/O file</a></h2>
|
||
</div>
|
||
<p>Because some file systems are case-insensitive I have implemented a
|
||
case-insensitive <code>strcmp()</code>; if the input file name is the same as the output file
|
||
name I won’t write to it. From a quick test this is important particularly if
|
||
neither file exist because if both calls to <code>stat()</code> fail then the inodes will be
|
||
the same (since what else could they be set to but the same initial value?).
|
||
This might be overprotective but I believe it better to prevent user error where
|
||
possible. Of course if neither file exists it might be argued that it’s not
|
||
necessary to worry since you can’t read from a file that doesn’t exist. But then
|
||
what about if one exists but the other does not?</p>
|
||
<div id="fileoptions">
|
||
<h2 id="file-options-parser-limitation"><a href="#toc">File options parser limitation</a></h2>
|
||
</div>
|
||
<p>Due to the way the parsing of options is done (no spaces between option char and
|
||
argument) shell expansion will not work right so for example doing:</p>
|
||
<pre><code> $ ./recode -R~/config</code></pre>
|
||
<p>will <em>not</em> read the file ‘config’ in the home directory. I show another way to
|
||
achieve this later.</p>
|
||
<p>This limitation also applies to the <code>-f</code> and <code>-o</code> options!</p>
|
||
<div id="validation">
|
||
<h2 id="r-option-validation"><a href="#toc">-R option validation?</a></h2>
|
||
</div>
|
||
<p>Again the <code>-R</code> option does not validate input. For validation you have to run
|
||
the program interactively.</p>
|
||
<div id="pipingtorecode">
|
||
<h1 id="piping-commands-to-recode"><a href="#toc">Piping commands to recode</a></h1>
|
||
</div>
|
||
<p>If stdin is not a tty (<code>!isatty(0)</code>) and neither randomised mode nor reading in
|
||
from a file is specified then you might just see something like:</p>
|
||
<pre><code> $ echo testing test tests | ./recode
|
||
1AB2BB3CC1testing test tests
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null
|
||
mfrwxan lzng ofnlu
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode
|
||
1AB2BB3CC1mfrwxan lzng ofnlu
|
||
|
||
$ echo testing test tests | ./recode | ./prog - 2>/dev/null | ./recode | ./prog - 2>/dev/null
|
||
testing test tests</code></pre>
|
||
<p>In other words just the defaults. This was to simplify the problems with
|
||
prompting again for input if it’s invalid (though as you’ll see it does a good
|
||
job at this anyway).</p>
|
||
<div id="pipingtoenigma">
|
||
<h1 id="piping-recode-to-the-enigma-simulator"><a href="#toc">Piping recode to the Enigma simulator</a></h1>
|
||
</div>
|
||
<p>If you’re using recode to recode the input so you don’t have to type in the
|
||
input manually (if you randomise or read in from previously saved file no input
|
||
need be done at all) then make sure to redirect stderr to /dev/null. If you
|
||
don’t you might see something like:</p>
|
||
<pre><code> $ ./recode -r | ./prog -
|
||
Ring 1: IOCCC
|
||
Setting 1: Position 1: Ring 2: Setting 2: Position 2: Ring 3: Setting 3: Position 3: Reflector: Plugboard pair 1: Plugboard pair 2: Plugboard pair 3: Plugboard pair 4: Plugboard pair 5: Plugboard pair 6: Plugboard pair 7: Plugboard pair 8: Plugboard pair 9: Plugboard pair 10: DEVIY</code></pre>
|
||
<p>What happened is that <code>Ring 1:</code> is printed to stderr but since it’s not been
|
||
redirected to <code>/dev/null</code> it prints this out; at this point however it prompts for
|
||
input. Why or how it shows the first prompt instead of later on I do not know.
|
||
Anyway at this point the simulator is already expecting input to en/decipher.
|
||
That’s why after I sent EOF it printed out the remaining strings to stderr.</p>
|
||
<div id="manuallytest">
|
||
<h1 id="manually-test-the-recode-program-with-the-enigma-program"><a href="#toc">Manually test the recode program with the Enigma program</a></h1>
|
||
</div>
|
||
<pre><code> $ cat input
|
||
IOCCC
|
||
|
||
$ ./recode -finput
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 1
|
||
Input rotor 2 (1 - 5): 2
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): A
|
||
Input setting 2 (A - Z): A
|
||
Input setting 3 (A - Z): A
|
||
Input position 1 (A - Z): A
|
||
Input position 2 (A - Z): A
|
||
Input position 3 (A - Z): A
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: AB
|
||
Input plugboard pair 2: CD
|
||
Input plugboard pair 3: ..
|
||
Input plugboard pair 4: EF
|
||
Input plugboard pair 5: GH
|
||
Input plugboard pair 6: IJ
|
||
Input plugboard pair 7: KL
|
||
Input plugboard pair 8: MN
|
||
Input plugboard pair 9: OP
|
||
Input plugboard pair 10: QR
|
||
1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC</code></pre>
|
||
<p>Notice that I skipped a <a href="https://www.cryptomuseum.com/crypto/enigma/i/sb.htm">plugboard
|
||
pair</a>; this can be done in
|
||
a number of ways but two dots is one. Notice also that it’s in a different order
|
||
than the simulator: because with the size restrictions on my entry I saved bytes
|
||
by using the same loop where I could. It just felt more natural to have them
|
||
grouped together in a configurator for the <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">simulator</a>.</p>
|
||
<pre><code> $ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null
|
||
HQNVO
|
||
$ echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRIOCCC | ./prog - 2>/dev/null | echo 1AA2AA3AA2ABCD..EFGHIJKLMNOPQRHQNVO | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>As you can see the <code>recode</code> program prompts for the settings and outputs the
|
||
input for the Enigma program. I then copied/pasted that output to the program
|
||
and got the result <code>HQNVO</code>.</p>
|
||
<p>Following this I piped the original output (of <code>recode</code>) to the simulator and then
|
||
piped that to the echo of the input settings (replacing the IOCCC with the
|
||
Enigma enciphered output) and then got the result IOCCC: the original input!
|
||
(This was before I implemented the <code>-R</code> option to greatly simplify things.)</p>
|
||
<p>Of course the last command was redundant in that I didn’t need to show the first
|
||
part again; I could have just done the latter part but I wanted to show the way
|
||
the pipeline works with settings etc.</p>
|
||
<p>What happens if the plugboard pairs are the same but in a different order? It’s
|
||
the same output:</p>
|
||
<pre><code> $ echo 1AA2AA3AA2AB..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||
HQNVO</code></pre>
|
||
<p>Also if you flip the order of the letters in the pair e.g. the AB as BA instead:</p>
|
||
<pre><code> $ echo 1AA2AA3AA2BA..CDEFGHIJKLMNOPQRIOCCC|./prog - 2>/dev/null
|
||
HQNVO</code></pre>
|
||
<div id="onlyconfig">
|
||
<h1 id="only-write-config-file"><a href="#toc">Only write config file</a></h1>
|
||
</div>
|
||
<pre><code> $ ./recode -v -oconfig -finput >/dev/null
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 1
|
||
Input rotor 2 (1 - 5): 2
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): A
|
||
Input setting 2 (A - Z): C
|
||
Input setting 3 (A - Z): E
|
||
Input position 1 (A - Z): B
|
||
Input position 2 (A - Z): D
|
||
Input position 3 (A - Z): F
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: AB
|
||
Input plugboard pair 2: CD
|
||
Input plugboard pair 3: EF
|
||
Input plugboard pair 4: GHIJ
|
||
Input plugboard pair 5: IJ
|
||
Input plugboard pair 6: KL
|
||
Input plugboard pair 7: MN
|
||
Input plugboard pair 8: OP
|
||
Input plugboard pair 9: QR
|
||
Input plugboard pair 10: ST
|
||
Ring 1: ( I) EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
Ring 2: ( II) AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
Ring 3: (III) BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
Ring settings: ACE
|
||
Ring positions: BDF
|
||
Reflector: (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Plugboard pair #01: AB
|
||
Plugboard pair #02: CD
|
||
Plugboard pair #03: EF
|
||
Plugboard pair #04: GH
|
||
Plugboard pair #05: IJ
|
||
Plugboard pair #06: KL
|
||
Plugboard pair #07: MN
|
||
Plugboard pair #08: OP
|
||
Plugboard pair #09: QR
|
||
Plugboard pair #10: ST</code></pre>
|
||
<p>Notice that I redirect stdout to /dev/null so that the config is only written to
|
||
the file config. But also notice that for <a href="https://www.cryptomuseum.com/crypto/enigma/i/sb.htm">plugboard
|
||
pair</a> 4 I typed in <code>GHIJ</code>
|
||
and it didn’t report an error. Neither did it complain about <code>IJ</code> in the next
|
||
pair. This is because it consumes input overflow.</p>
|
||
<p>It shouldn’t be this way for the simulator though because that could cause
|
||
inconsistent number of characters expected before the text to encipher.</p>
|
||
<pre><code> $ cat config
|
||
1AB2CD3EF2ABCDEFGHIJKLMNOPQRST
|
||
|
||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null
|
||
LRAVE
|
||
|
||
$ ( cat config ; cat input ) | ./prog - 2>/dev/null | ( cat config ; echo LRAVE ) | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>What if you don’t want to worry about having to specify input but just have the
|
||
settings written? You can do that too by either sending a newline or else
|
||
directly type ctrl-d (or whatever you have EOF set to) or give it an empty file.</p>
|
||
<p>The following are all equivalent in that they will write to a settings file (the
|
||
first one will print a newline with the echo but that won’t matter):</p>
|
||
<pre><code> $ echo | ./recode -r -osettings
|
||
$ echo -n | ./recode -r -osettings
|
||
$ > empty
|
||
$ ./recode -r -osettings < empty
|
||
$ cat empty | ./recode -r -osettings
|
||
$ ./recode -r -osettings
|
||
^D</code></pre>
|
||
<p>(Above ^D was not shown but I typed it.) The way it works: if nothing is read
|
||
the buffer remains <code>NULL</code> and so I don’t print it but still do print the settings
|
||
file. (Actually even if <code>getdelim()</code> fails you’re supposed to free the buffer so I
|
||
set another variable to indicate if it should be printed.)</p>
|
||
<div id="reuseconfig">
|
||
<h1 id="reusing-a-configuration"><a href="#toc">Reusing a configuration</a></h1>
|
||
</div>
|
||
<pre><code> $ echo -n|./recode -r -oconfig
|
||
4UH5II1RJ1SPIFEJLYGZWRTBHVCAMN$
|
||
|
||
$ cat input.txt
|
||
IOCCC 2020 Enigma simulator example text file
|
||
|
||
This is a sentence.
|
||
|
||
This is another sentence.
|
||
|
||
$ ( cat config ; cat input.txt ) | ./prog - 2>/dev/null > output
|
||
$ cat output
|
||
AAPRT 2020 Dkemny tpgnjsjai xpovrgl jvgs wxra
|
||
|
||
Fytt ly m xyiilaqh.
|
||
|
||
Ybbp ox dmuzerm oscwgytb.
|
||
$ ( cat config ; cat output ) | ./prog - 2>/dev/null > io
|
||
$ diff io input.txt
|
||
$</code></pre>
|
||
<p>Alternatively you can just use the <code>-R</code> and <code>-f</code> options:</p>
|
||
<pre><code> $ ./recode -finput.txt -Rconfig | ./prog - 2>/dev/null > output2
|
||
$ diff output output2
|
||
$</code></pre>
|
||
<div id="passtoenigma">
|
||
<h1 id="write-config-file-read-data-file-and-pass-to-enigma-simulator"><a href="#toc">Write config file, read data file and pass to Enigma simulator</a></h1>
|
||
</div>
|
||
<pre><code> $ ./recode -finput.txt -oconfig | ./prog - 2>/dev/null > output
|
||
Rotors:
|
||
(1) I: EKMFLGDQVZNTOWYHXUSPAIBRCJ
|
||
(2) II: AJDKSIRUXBLHWTMCQGZNPYFVOE
|
||
(3) III: BDFHJLCPRTXVZNYEIWGAKMUSQO
|
||
(4) IV: ESOVPZJAYQUIRHXLNFTGKDCMWB
|
||
(5) V: VZBRGITYUPSDNHLXAWMJQOFECK
|
||
Input rotor 1 (1 - 5): 2
|
||
Input rotor 2 (1 - 5): 5
|
||
Input rotor 3 (1 - 5): 3
|
||
Input setting 1 (A - Z): C
|
||
Input setting 2 (A - Z): O
|
||
Input setting 3 (A - Z): D
|
||
Input position 1 (A - Z): E
|
||
Input position 2 (A - Z): L
|
||
Input position 3 (A - Z): O
|
||
Reflector:
|
||
(1) (B) YRUHQSLDPXNGOKMIEBFZCWVJAT
|
||
(2) (C) FVPJIAOYEDRZXWGCTKUQSBNMHL
|
||
Input reflector (1 - 2): 2
|
||
Input plugboard pair 1: TR
|
||
Input plugboard pair 2: SN
|
||
Input plugboard pair 3: OG
|
||
Input plugboard pair 4: ME
|
||
Input plugboard pair 5: XY
|
||
Input plugboard pair 6: WZ
|
||
Input plugboard pair 7: UV
|
||
Input plugboard pair 8: AB
|
||
Input plugboard pair 9: CD
|
||
Input plugboard pair 10: FI
|
||
|
||
$ cat config
|
||
2CE5OL3DO2TRSNOGMEXYWZUVABCDFI</code></pre>
|
||
<p>Besides a famous book that I happen to love (who doesn’t? Ah, but what is it
|
||
Cody?) there’s also a reference to code which I also love (just as all
|
||
participants of the IOCCC do). Other things there don’t mean anything but what
|
||
does is the output:</p>
|
||
<pre><code> $ cat output
|
||
DBFAF 2020 Ittejg ltblwriac uqdfqvr dhqh ghhf
|
||
|
||
Jsjy ce v pxdmullo.
|
||
|
||
Sara tj rtaayak uxfhjcti.
|
||
|
||
$ ./recode -Rconfig -foutput | ./prog - 2>/dev/null
|
||
IOCCC 2020 Enigma simulator example text file
|
||
|
||
This is a sentence.
|
||
|
||
This is another sentence.</code></pre>
|
||
<div id="directlytoenigma">
|
||
<h1 id="piping-directly-to-the-enigma-code-once-with-randomised-settings-saved"><a href="#toc">Piping directly to the Enigma code once (with randomised settings, saved)</a></h1>
|
||
</div>
|
||
<p>This is like the above only randomised:</p>
|
||
<pre><code> $ ./recode -r -oconfig|./prog - 2>/dev/null
|
||
IOCCC
|
||
UGEVP</code></pre>
|
||
<p>Note that I typed in <code>IOCCC</code> and sent <code>EOF</code> (ctrl-d); the settings were written to
|
||
the config file (for deciphering later) and then all of it was piped to the
|
||
Enigma entry resulting in the line below IOCCC. But let’s verify it worked out
|
||
okay:</p>
|
||
<pre><code> $ cat config
|
||
2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ</code></pre>
|
||
<p>Without having to copy/paste intermediate results:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -Rconfig | ./prog - 2>/dev/null | ./recode -Rconfig | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<p>You can also use a string for the <code>-R</code> option. I’ll use command substitution and
|
||
actual pasting to demonstrate:</p>
|
||
<pre><code> $ echo IOCCC | ./recode -R$(cat config) | ./prog - 2>/dev/null | ./recode -R2BM4GJ3HK1LNCBXWRMGKSYIAZUTPVJ | ./prog - 2>/dev/null
|
||
IOCCC</code></pre>
|
||
<div id="conclusion">
|
||
<h1 id="usage-conclusion"><a href="#toc">Usage conclusion</a></h1>
|
||
</div>
|
||
<p>That should give you an idea of how to use the <code>recode</code> program. I leave it as
|
||
an exercise to the reader to implement additional features but here are some
|
||
ideas of what could be done and how this entry might be used (including that
|
||
delicious challenge).</p>
|
||
<div id="additions">
|
||
<h1 id="example-additions"><a href="#toc">Example additions</a></h1>
|
||
</div>
|
||
<ul>
|
||
<li>Add code, to <a href="https://github.com/ioccc-src/temp-test-ioccc/blob/master/2020/ferguson2/prog.c">prog.c</a>, that tries to determine possible decipherments based on
|
||
a given crib (or set of cribs).</li>
|
||
</ul>
|
||
<div id="exampleuses">
|
||
<h1 id="example-uses"><a href="#toc">Example uses</a></h1>
|
||
</div>
|
||
<ul>
|
||
<li><p>Take an actual key sheet and message for that day and try and decipher the
|
||
message (might help if you know German!). I haven’t actually done this for
|
||
reasons I explained in the remarks (including that I cannot easily verify one
|
||
particular as well as the fact that there were different procedures, different
|
||
machines etc. - plus my vision is not good enough for the quality of the
|
||
pictures).</p></li>
|
||
<li><p>Try making sense of a politician’s speeches by putting them into the
|
||
simulator. It might not make much sense but can it honestly be that much worse ?
|
||
:) Actually yes it could be (and we don’t need the Enigma helping them either)
|
||
and I can think of a whole host of other things more entertaining including
|
||
watching dry paint stay dry on a wall but why not poke fun at politicians
|
||
anyway?</p></li>
|
||
<li><p>Best idea: try the below experiment!</p></li>
|
||
</ul>
|
||
<div id="fun">
|
||
<h1 id="a-fun-way-to-explore-my-enigma-machine-with-a-surprise"><a href="#toc">A fun way to explore my Enigma machine, with a surprise</a></h1>
|
||
</div>
|
||
<p>As I was making the above silly list something occurred to me. My <a href="https://www.ioccc.org/2020/ferguson1/index.html">other
|
||
entry</a> this year includes a
|
||
<a href="https://www.ioccc.org/2020/ferguson1/chocolate-cake.html">recipe for a wonderful double-layered chocolate fudge
|
||
cake</a> but then
|
||
shouldn’t this entry include something that is fun too? But if that’s the case
|
||
why on Earth should it be unscrambled? It would be more fun and a great way to
|
||
explore this entry if you have to use the Enigma machine to read the message!</p>
|
||
<p>So this is what I offer: if you take one of the settings below and run the
|
||
Enigma machine simulator on the file <a href="enigma.txt">enigma.txt</a> you will
|
||
unlock a html file with something special in it. I recommend you decrypt it to
|
||
<code>decrypted.html</code> and open it in a web browser.</p>
|
||
<p>The correct settings is listed below but <em>you</em> must determine which one is the
|
||
right line. Before you do this here are some things to ask yourself:</p>
|
||
<ol start="0" type="1">
|
||
<li><p>Are any invalid input?</p></li>
|
||
<li><p>Is there some other kind of trickery involved here?</p></li>
|
||
</ol>
|
||
<p>I can think of the best way to answer these and I think I need not even mention
|
||
it. Have fun and enjoy!</p>
|
||
<h2 id="hints">Hints:</h2>
|
||
<ol start="0" type="1">
|
||
<li><p>It’s not the middle one.</p></li>
|
||
<li><p>Yes there are some things kind of spelt here. Some things spelt mean nothing
|
||
whatever and can be considered coincidences. Some were randomised.</p></li>
|
||
<li><p>There is an obscure thing about my entry that can help locate the proper key
|
||
of the 16 given below! The questions are what is it and is is it worth going
|
||
this way? (I think the second answer is ‘yes’ but that’s me.)</p></li>
|
||
</ol>
|
||
<p>Of course, the above points might or might not be relevant. Didst you really
|
||
think that I would give too much away? :)</p>
|
||
<pre><code> 142CHOCOLATESVCAKESTBJLKMUMVWX
|
||
0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI
|
||
3UY0XF4QG1GTJQLARPKHBEMCOFVUIN
|
||
0WE1HK4PL0RVSGXFDKENZYTPCMAHUW
|
||
2LV0KC1IE0HTFPCLWOJDBQIRVMEAGN
|
||
1SS4QX2RY1SRAQGKUYHCBLPFJDVTNZ
|
||
3IW1QR0TZ0GQEDWIYJUPMFZBRAONHS
|
||
3OP1KN4MO0HPFZCEAKYQIRXGVMOTUW
|
||
4OC2CC0AK1CODELUVRSNGKIZBJPTMY
|
||
4MU0MS1CA1KELUVRSXTABJNOCDMQFG
|
||
0MU4MC2HO1CLATEFBJMONPQRVWXYZD
|
||
125CHOCOLATESEXCAKESJADFNOPQRS
|
||
0CH3OC1OL1ATEMBJNOCDLSIFWHRVXY
|
||
4MU1MS3CA0KECHOLATBJSNPXVUFGZY
|
||
4VW0SL1YB0IYJSLBECKTNAXGPUVHRF
|
||
0MC4OH2CO1LATEUMBJCDFGHINOPRQS</code></pre>
|
||
<p>BTW: what’s the middle of a list with even numbered items anyway?</p>
|
||
<p>To help you out, though, this is how you might do the decrypting. Assuming that
|
||
the key you wish to select is</p>
|
||
<pre><code> 0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI</code></pre>
|
||
<p>you can do:</p>
|
||
<pre><code> ./recode -R0EZ4PC1CC0PGTAQSOXWNMDRYKFUZEI -fenigma.txt | ./prog - 2>/dev/null > enigma.html</code></pre>
|
||
<p>Then open <code>enigma.html</code> in your browser. A command is provided in
|
||
<a href="testing-procedure.html">testing-procedure.html</a> that does this too but it
|
||
shows how you can use a file as input for the key instead as well as how I
|
||
tested the code.</p>
|
||
<hr style="width:10%;text-align:left;margin-left:0">
|
||
<p>Jump to: <a href="#">top</a></p>
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
<!-- AFTER: last line of markdown file: 2020/ferguson2/recode.md -->
|
||
|
||
<!-- END: this line ends content for HTML phase 21 by: bin/pandoc-wrapper.sh via bin/md2html.sh -->
|
||
<!-- START: this line starts content from: inc/after-content.default.html -->
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/after-content.default.html -->
|
||
<!-- START: this line starts content from: inc/footer.default.html -->
|
||
|
||
<!--
|
||
|
||
Copyright © 1984-2024 by Landon Curt Noll. All Rights Reserved.
|
||
|
||
You are free to share and adapt this file under the terms of this license:
|
||
|
||
Creative Commons Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)
|
||
|
||
For more information, see:
|
||
|
||
https://creativecommons.org/licenses/by-sa/4.0/
|
||
|
||
-->
|
||
|
||
<div class="footer">
|
||
|
||
<div id="copyright"><h3>Copyright © 1984-2024 by Landon Curt Noll:
|
||
<a href="https://creativecommons.org/faq/#what-does-some-rights-reserved-mean"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">Some Rights Reserved</a></h3>
|
||
<p>
|
||
This work is <b>licensed by Landon Curt Noll</b> under
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/?ref=chooser-v1"
|
||
target="_blank"
|
||
rel="license noopener noreferrer"
|
||
style="display:inline-block;">CC BY-SA 4.0</a></b>.
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/cc.png"
|
||
alt="cc inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/by.png"
|
||
alt="person inside circle symbol">
|
||
<img style="height:22px!important;margin-left:3px;vertical-align:text-bottom;"
|
||
src="../../png/sa.png"
|
||
alt="arrow looping back on itself inside circle symbol"><br>
|
||
You should <b>carefully review</b> the
|
||
<b><a href="https://creativecommons.org/licenses/by-sa/4.0/legalcode.en"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">CC BY-SA 4.0 LEGAL CODE</a></b>
|
||
before using the licensed material.<br>
|
||
You may wish to review the
|
||
<b><a href="../../license.html"
|
||
target="_blank"
|
||
rel="license noopener noreferrer">highlights of some of the key features and terms</a></b>
|
||
of <b>CC BY-SA 4.0</b>.<br>
|
||
</p>
|
||
</div>
|
||
|
||
<div id="coda"><h3>Coda</h3>
|
||
<p>
|
||
<a href="https://validator.w3.org/nu/?doc=https%3A%2F%2Fioccc-src.github.io%2Ftemp-test-ioccc%2F2020%2Fferguson2%2Frecode.html" rel="nofollow">Nu HTML check this web page</a><br>
|
||
<a href="#top">Jump to top</a> <a href="#content">Jump to Content</a>
|
||
</p>
|
||
</div>
|
||
|
||
</div>
|
||
|
||
<!-- END: this line ends content from: inc/footer.default.html -->
|
||
<!-- START: this line starts content from: inc/bottom.default.html -->
|
||
|
||
</body>
|
||
</html>
|
||
|
||
<!-- END: this line ends content from: inc/bottom.default.html -->
|