1
0
Fork 0
mirror of https://github.com/ganelson/inform.git synced 2024-07-08 01:54:21 +03:00
inform7/docs/basic_inform/S-ct.html

188 lines
10 KiB
HTML
Raw Normal View History

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>S/bt</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<meta http-equiv="Content-Language" content="en-gb">
<link href="inweb.css" rel="stylesheet" rev="stylesheet" type="text/css">
</head>
<body>
<!--Weave of 'S/ct' generated by 7-->
<ul class="crumbs"><li><a href="../webs.html">&#9733;</a></li><li><a href="index.html">basic_inform Template Library</a></li><li><b>Char Template</b></li></ul><p class="purpose">To decide whether letters are upper or lower case, and convert between the two.</p>
<ul class="toc"><li><a href="#SP1">&#167;1. Char Is Of Case</a></li><li><a href="#SP2">&#167;2. Char To Case</a></li><li><a href="#SP3">&#167;3. Reversing Case</a></li><li><a href="#SP4">&#167;4. DigitToValue</a></li><li><a href="#SP5">&#167;5. Testing</a></li></ul><hr class="tocbar">
<p class="inwebparagraph"><a id="SP1"></a><b>&#167;1. Char Is Of Case. </b>The following decides whether a character <code class="display"><span class="extract">c</span></code> belongs to case <code class="display"><span class="extract">case</span></code>, where
0 means lower case and 1 means upper. <code class="display"><span class="extract">c</span></code> is interpreted according to the
character casing chart in "UnicodeData.i6t", which means, it will be
ZSCII for the Z-machine and Unicode for Glulx.
</p>
<pre class="display">
<span class="plain">[ CharIsOfCase c case</span>
<span class="plain">i tab min max len par;</span>
<span class="plain">if (c&lt;'A') rfalse;</span>
<span class="plain">if (case == 0) {</span>
<span class="plain">if ((c &gt;= 'a') &amp;&amp; (c &lt;= 'z')) rtrue;</span>
<span class="plain">tab = CharCasingChart0;</span>
<span class="plain">} else {</span>
<span class="plain">if ((c &gt;= 'A') &amp;&amp; (c &lt;= 'Z')) rtrue;</span>
<span class="plain">tab = CharCasingChart1;</span>
<span class="plain">}</span>
<span class="plain">if (c&lt;128) rfalse;</span>
<span class="plain">while (tab--&gt;i) {</span>
<span class="plain">min = tab--&gt;i; i++;</span>
<span class="plain">len = tab--&gt;i; i++;</span>
<span class="plain">i++;</span>
<span class="plain">par = 0;</span>
<span class="plain">if (len&lt;0) { par = 1; len = -len; }</span>
<span class="plain">if (c &lt; min) rfalse;</span>
<span class="plain">if (c &lt; min+len) {</span>
<span class="plain">if (par) { if ((c-min) % 2 == 0) rtrue; }</span>
<span class="plain">else { rtrue; }</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">rfalse;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP2"></a><b>&#167;2. Char To Case. </b>And the following converts character <code class="display"><span class="extract">c</span></code> to the desired case, or returns
it unchanged if it is not a letter with variant casings.
</p>
<pre class="display">
<span class="plain">[ CharToCase c case</span>
<span class="plain">i tab min max len par del f;</span>
<span class="plain">if (c&lt;'A') return c;</span>
<span class="plain">if (case == 1) {</span>
<span class="plain">if ((c &gt;= 'a') &amp;&amp; (c &lt;= 'z')) return c-32;</span>
<span class="plain">tab = CharCasingChart0;</span>
<span class="plain">} else {</span>
<span class="plain">if ((c &gt;= 'A') &amp;&amp; (c &lt;= 'Z')) return c+32;</span>
<span class="plain">tab = CharCasingChart1;</span>
<span class="plain">}</span>
<span class="plain">if (c&lt;128) return c;</span>
<span class="plain">while (tab--&gt;i) {</span>
<span class="plain">min = tab--&gt;i; i++;</span>
<span class="plain">len = tab--&gt;i; i++;</span>
<span class="plain">del = tab--&gt;i; i++;</span>
<span class="plain">par = 0;</span>
<span class="plain">if (len&lt;0) { par = 1; len = -len; }</span>
<span class="plain">if (c &lt; min) return c;</span>
<span class="plain">if (c &lt; min+len) {</span>
<span class="plain">f = false;</span>
<span class="plain">if (par) { if ((c-min) % 2 == 0) f = true; }</span>
<span class="plain">else { f = true; }</span>
<span class="plain">if (f) {</span>
<span class="plain">if (del == UNIC_NCT) return c;</span>
<span class="plain">return c+del;</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">}</span>
<span class="plain">return c;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP3"></a><b>&#167;3. Reversing Case. </b>It's convenient to provide this relatively fast routine to reverse the
case of a letter since this is an operation used frequently in regular
expression matching (see "RegExp.i6t").
</p>
<pre class="display">
<span class="plain">#IFDEF TARGET_ZCODE;</span>
<span class="plain">[ TEXT_TY_RevCase ch;</span>
<span class="plain">if (ch&lt;'A') return ch;</span>
<span class="plain">if ((ch &gt;= 'a') &amp;&amp; (ch &lt;= 'z')) return ch-'a'+'A';</span>
<span class="plain">if ((ch &gt;= 'A') &amp;&amp; (ch &lt;= 'Z')) return ch-'A'+'a';</span>
<span class="plain">if (ch&lt;128) return ch;</span>
<span class="plain">if ((ch &gt;= 155) &amp;&amp; (ch &lt;= 157)) return ch+3; ! a, o, u umlaut in ZSCII</span>
<span class="plain">if ((ch &gt;= 158) &amp;&amp; (ch &lt;= 160)) return ch-3; ! A, O, U umlaut</span>
<span class="plain">if ((ch &gt;= 164) &amp;&amp; (ch &lt;= 165)) return ch+3; ! e, i umlaut</span>
<span class="plain">if ((ch &gt;= 167) &amp;&amp; (ch &lt;= 168)) return ch-3; ! E, I umlaut</span>
<span class="plain">if ((ch &gt;= 169) &amp;&amp; (ch &lt;= 174)) return ch+6; ! a, e, i, o, u, y acute</span>
<span class="plain">if ((ch &gt;= 175) &amp;&amp; (ch &lt;= 180)) return ch-6; ! A, E, I, O, U, Y acute</span>
<span class="plain">if ((ch &gt;= 181) &amp;&amp; (ch &lt;= 185)) return ch+5; ! a, e, i, o, u grave</span>
<span class="plain">if ((ch &gt;= 186) &amp;&amp; (ch &lt;= 190)) return ch-5; ! A, E, I, O, U grave</span>
<span class="plain">if ((ch &gt;= 191) &amp;&amp; (ch &lt;= 195)) return ch+5; ! a, e, i, o, u circumflex</span>
<span class="plain">if ((ch &gt;= 196) &amp;&amp; (ch &lt;= 200)) return ch-5; ! A, E, I, O, U circumflex</span>
<span class="plain">if (ch == 201) return 202; ! a circle</span>
<span class="plain">if (ch == 202) return 201; ! A circle</span>
<span class="plain">if (ch == 203) return 204; ! o slash</span>
<span class="plain">if (ch == 204) return 203; ! O slash</span>
<span class="plain">if ((ch &gt;= 205) &amp;&amp; (ch &lt;= 207)) return ch+3; ! a, n, o tilde</span>
<span class="plain">if ((ch &gt;= 208) &amp;&amp; (ch &lt;= 210)) return ch-3; ! A, N, O tilde</span>
<span class="plain">if (ch == 211) return 212; ! ae ligature</span>
<span class="plain">if (ch == 212) return 211; ! AE ligature</span>
<span class="plain">if (ch == 213) return 214; ! c cedilla</span>
<span class="plain">if (ch == 214) return 213; ! C cedilla</span>
<span class="plain">if (ch == 215 or 216) return ch+2; ! thorn, eth</span>
<span class="plain">if (ch == 217 or 218) return ch-2; ! Thorn, Eth</span>
<span class="plain">if (ch == 220) return 221; ! oe ligature</span>
<span class="plain">if (ch == 221) return 220; ! OE ligature</span>
<span class="plain">return ch;</span>
<span class="plain">];</span>
<span class="plain">#IFNOT;</span>
<span class="plain">[ TEXT_TY_RevCase ch;</span>
<span class="plain">if (ch&lt;'A') return ch;</span>
<span class="plain">if ((ch &gt;= 'a') &amp;&amp; (ch &lt;= 'z')) return ch-'a'+'A';</span>
<span class="plain">if ((ch &gt;= 'A') &amp;&amp; (ch &lt;= 'Z')) return ch-'A'+'a';</span>
<span class="plain">if (ch&lt;128) return ch;</span>
<span class="plain">if (CharIsOfCase(ch, 0)) return CharToCase(ch, 1);</span>
<span class="plain">if (CharIsOfCase(ch, 1)) return CharToCase(ch, 0);</span>
<span class="plain">return ch;</span>
<span class="plain">];</span>
<span class="plain">#ENDIF;</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP4"></a><b>&#167;4. DigitToValue. </b>This takes a ZSCII or Unicode character code and returns its value as a digit,
or returns -1 if it isn't a digit.
</p>
<pre class="display">
<span class="plain">[ DigitToValue c n;</span>
<span class="plain">n = c-'0';</span>
<span class="plain">if ((n&lt;0) || (n&gt;9)) return -1;</span>
<span class="plain">return n;</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<p class="inwebparagraph"><a id="SP5"></a><b>&#167;5. Testing. </b>Not actually used: simply for testing the tables.
</p>
<pre class="display">
<span class="plain">[ CharTestCases case i j;</span>
<span class="plain">for (i=32: i&lt;$E0: i++) {</span>
<span class="plain">if ((i&gt;=127) &amp;&amp; (i&lt;155)) continue;</span>
<span class="plain">print i, " - ", (char) i, " -";</span>
<span class="plain">if (CharIsOfCase(i, 0)) print " lower";</span>
<span class="plain">if (CharIsOfCase(i, 1)) print " upper";</span>
<span class="plain">j = CharToCase(i, 0); if (j ~= i) print " tolower: ", (char) j;</span>
<span class="plain">j = CharToCase(i, 1); if (j ~= i) print " toupper: ", (char) j;</span>
<span class="plain">print "^";</span>
<span class="plain">}</span>
<span class="plain">];</span>
</pre>
<p class="inwebparagraph"></p>
<hr class="tocbar">
<ul class="toc"><li><a href="S-bt.html">Back to 'BlockValues Template'</a></li><li><a href="S-ct2.html">Continue with 'Combinations Template'</a></li></ul><hr class="tocbar">
<!--End of weave-->
</body>
</html>