mirror of
https://github.com/ganelson/inform.git
synced 2024-07-08 01:54:21 +03:00
188 lines
10 KiB
HTML
188 lines
10 KiB
HTML
|
<!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">★</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">§1. Char Is Of Case</a></li><li><a href="#SP2">§2. Char To Case</a></li><li><a href="#SP3">§3. Reversing Case</a></li><li><a href="#SP4">§4. DigitToValue</a></li><li><a href="#SP5">§5. Testing</a></li></ul><hr class="tocbar">
|
||
|
|
||
|
<p class="inwebparagraph"><a id="SP1"></a><b>§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<'A') rfalse;</span>
|
||
|
<span class="plain">if (case == 0) {</span>
|
||
|
<span class="plain">if ((c >= 'a') && (c <= 'z')) rtrue;</span>
|
||
|
<span class="plain">tab = CharCasingChart0;</span>
|
||
|
<span class="plain">} else {</span>
|
||
|
<span class="plain">if ((c >= 'A') && (c <= 'Z')) rtrue;</span>
|
||
|
<span class="plain">tab = CharCasingChart1;</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="plain">if (c<128) rfalse;</span>
|
||
|
<span class="plain">while (tab-->i) {</span>
|
||
|
<span class="plain">min = tab-->i; i++;</span>
|
||
|
<span class="plain">len = tab-->i; i++;</span>
|
||
|
<span class="plain">i++;</span>
|
||
|
<span class="plain">par = 0;</span>
|
||
|
<span class="plain">if (len<0) { par = 1; len = -len; }</span>
|
||
|
<span class="plain">if (c < min) rfalse;</span>
|
||
|
<span class="plain">if (c < 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>§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<'A') return c;</span>
|
||
|
<span class="plain">if (case == 1) {</span>
|
||
|
<span class="plain">if ((c >= 'a') && (c <= 'z')) return c-32;</span>
|
||
|
<span class="plain">tab = CharCasingChart0;</span>
|
||
|
<span class="plain">} else {</span>
|
||
|
<span class="plain">if ((c >= 'A') && (c <= 'Z')) return c+32;</span>
|
||
|
<span class="plain">tab = CharCasingChart1;</span>
|
||
|
<span class="plain">}</span>
|
||
|
<span class="plain">if (c<128) return c;</span>
|
||
|
<span class="plain">while (tab-->i) {</span>
|
||
|
<span class="plain">min = tab-->i; i++;</span>
|
||
|
<span class="plain">len = tab-->i; i++;</span>
|
||
|
<span class="plain">del = tab-->i; i++;</span>
|
||
|
<span class="plain">par = 0;</span>
|
||
|
<span class="plain">if (len<0) { par = 1; len = -len; }</span>
|
||
|
<span class="plain">if (c < min) return c;</span>
|
||
|
<span class="plain">if (c < 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>§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<'A') return ch;</span>
|
||
|
<span class="plain">if ((ch >= 'a') && (ch <= 'z')) return ch-'a'+'A';</span>
|
||
|
<span class="plain">if ((ch >= 'A') && (ch <= 'Z')) return ch-'A'+'a';</span>
|
||
|
<span class="plain">if (ch<128) return ch;</span>
|
||
|
<span class="plain">if ((ch >= 155) && (ch <= 157)) return ch+3; ! a, o, u umlaut in ZSCII</span>
|
||
|
<span class="plain">if ((ch >= 158) && (ch <= 160)) return ch-3; ! A, O, U umlaut</span>
|
||
|
<span class="plain">if ((ch >= 164) && (ch <= 165)) return ch+3; ! e, i umlaut</span>
|
||
|
<span class="plain">if ((ch >= 167) && (ch <= 168)) return ch-3; ! E, I umlaut</span>
|
||
|
<span class="plain">if ((ch >= 169) && (ch <= 174)) return ch+6; ! a, e, i, o, u, y acute</span>
|
||
|
<span class="plain">if ((ch >= 175) && (ch <= 180)) return ch-6; ! A, E, I, O, U, Y acute</span>
|
||
|
<span class="plain">if ((ch >= 181) && (ch <= 185)) return ch+5; ! a, e, i, o, u grave</span>
|
||
|
<span class="plain">if ((ch >= 186) && (ch <= 190)) return ch-5; ! A, E, I, O, U grave</span>
|
||
|
<span class="plain">if ((ch >= 191) && (ch <= 195)) return ch+5; ! a, e, i, o, u circumflex</span>
|
||
|
<span class="plain">if ((ch >= 196) && (ch <= 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 >= 205) && (ch <= 207)) return ch+3; ! a, n, o tilde</span>
|
||
|
<span class="plain">if ((ch >= 208) && (ch <= 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<'A') return ch;</span>
|
||
|
<span class="plain">if ((ch >= 'a') && (ch <= 'z')) return ch-'a'+'A';</span>
|
||
|
<span class="plain">if ((ch >= 'A') && (ch <= 'Z')) return ch-'A'+'a';</span>
|
||
|
<span class="plain">if (ch<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>§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<0) || (n>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>§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<$E0: i++) {</span>
|
||
|
<span class="plain">if ((i>=127) && (i<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>
|
||
|
|