u2cp437/
lib.rs

1// This crate is derived from https://github.com/nabijaczleweli/codepage-437, which is licenced as
2// follows:
3//
4// The MIT License (MIT)
5//
6// Copyright (c) 2018 nabijaczleweli
7//
8// Permission is hereby granted, free of charge, to any person obtaining a copy
9// of this software and associated documentation files (the "Software"), to deal
10// in the Software without restriction, including without limitation the rights
11// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12// copies of the Software, and to permit persons to whom the Software is
13// furnished to do so, subject to the following conditions:
14//
15// The above copyright notice and this permission notice shall be included in all
16// copies or substantial portions of the Software.
17//
18// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
24// SOFTWARE.
25
26//! Bare-bones Unicode to [code page 437](https://en.wikipedia.org/wiki/Code_page_437) conversion.
27//!
28//! Derived for `#![no_std]` use from [`nabijaczleweli/codepage-437`](https://github.com/nabijaczleweli/codepage-437).
29
30#![no_std]
31
32/// Do it.
33///
34/// ```rust
35/// // Matching unicode code points produce code page 437 code points as `u8`
36/// assert_eq!(u2cp437::convert('☻'), Some(0x02));
37///
38/// // Certain CP437 code points have multiple unicode equivalents
39/// let mu1 = u2cp437::convert('\u{0000B5}'); // "MICRO SIGN"
40/// let mu2 = u2cp437::convert('\u{0003BC}'); // "GREEK SMALL LETTER MU"
41/// assert_eq!(mu1, Some(0xE6));
42/// assert_eq!(mu1, mu2);
43///
44/// // Unicode code points that have no equivalent in CP437, including all control characters but
45/// // the null character, produce nothing
46/// assert_eq!(u2cp437::convert('🤔'), None);
47/// assert_eq!(u2cp437::convert('\n'), None);
48/// assert_eq!(u2cp437::convert('\0'), Some(0x0));
49/// ```
50pub fn convert(unicode: char) -> Option<u8> {
51    Some(match unicode {
52        // Non-overlapping code points
53        '\u{00263A}' => 0x01, // WHITE SMILING FACE
54        '\u{00263B}' => 0x02, // BLACK SMILING FACE
55        '\u{002665}' => 0x03, // BLACK HEART SUIT
56        '\u{002666}' => 0x04, // BLACK DIAMOND SUIT
57        '\u{002663}' => 0x05, // BLACK CLUB SUIT
58        '\u{002660}' => 0x06, // BLACK SPADE SUIT
59        '\u{002022}' => 0x07, // BULLET
60        '\u{0025D8}' => 0x08, // INVERSE BULLET
61        '\u{0025CB}' => 0x09, // WHITE CIRCLE
62        '\u{0025D9}' => 0x0A, // INVERSE WHITE CIRCLE
63        '\u{002642}' => 0x0B, // MALE SIGN
64        '\u{002640}' => 0x0C, // FEMALE SIGN
65        '\u{00266A}' => 0x0D, // EIGHTH NOTE
66        '\u{00266B}' => 0x0E, // BEAMED EIGHTH NOTES
67        '\u{00263C}' => 0x0F, // WHITE SUN WITH RAYS
68        '\u{0025BA}' => 0x10, // BLACK RIGHT-POINTING POINTER
69        '\u{0025C4}' => 0x11, // BLACK LEFT-POINTING POINTER
70        '\u{002195}' => 0x12, // UP DOWN ARROW
71        '\u{00203C}' => 0x13, // DOUBLE EXCLAMATION MARK
72        '\u{0000B6}' => 0x14, // PILCROW SIGN
73        '\u{0000A7}' => 0x15, // SECTION SIGN
74        '\u{0025AC}' => 0x16, // BLACK RECTANGLE
75        '\u{0021A8}' => 0x17, // UP DOWN ARROW WITH BASE
76        '\u{002191}' => 0x18, // UPWARDS ARROW
77        '\u{002193}' => 0x19, // DOWNWARDS ARROW
78        '\u{002192}' => 0x1A, // RIGHTWARDS ARROW
79        '\u{002190}' => 0x1B, // LEFTWARDS ARROW
80        '\u{00221F}' => 0x1C, // RIGHT ANGLE
81        '\u{002194}' => 0x1D, // LEFT RIGHT ARROW
82        '\u{0025B2}' => 0x1E, // BLACK UP-POINTING TRIANGLE
83        '\u{0025BC}' => 0x1F, // BLACK DOWN-POINTING TRIANGLE
84        '\u{002302}' => 0x7F, // HOUSE
85        '\u{0000C7}' => 0x80, // LATIN CAPITAL LETTER C WITH CEDILLA
86        '\u{0000FC}' => 0x81, // LATIN SMALL LETTER U WITH DIAERESIS
87        '\u{0000E9}' => 0x82, // LATIN SMALL LETTER E WITH ACUTE
88        '\u{0000E2}' => 0x83, // LATIN SMALL LETTER A WITH CIRCUMFLEX
89        '\u{0000E4}' => 0x84, // LATIN SMALL LETTER A WITH DIAERESIS
90        '\u{0000E0}' => 0x85, // LATIN SMALL LETTER A WITH GRAVE
91        '\u{0000E5}' => 0x86, // LATIN SMALL LETTER A WITH RING ABOVE
92        '\u{0000E7}' => 0x87, // LATIN SMALL LETTER C WITH CEDILLA
93        '\u{0000EA}' => 0x88, // LATIN SMALL LETTER E WITH CIRCUMFLEX
94        '\u{0000EB}' => 0x89, // LATIN SMALL LETTER E WITH DIAERESIS
95        '\u{0000E8}' => 0x8A, // LATIN SMALL LETTER E WITH GRAVE
96        '\u{0000EF}' => 0x8B, // LATIN SMALL LETTER I WITH DIAERESIS
97        '\u{0000EE}' => 0x8C, // LATIN SMALL LETTER I WITH CIRCUMFLEX
98        '\u{0000EC}' => 0x8D, // LATIN SMALL LETTER I WITH GRAVE
99        '\u{0000C4}' => 0x8E, // LATIN CAPITAL LETTER A WITH DIAERESIS
100        '\u{0000C5}' => 0x8F, // LATIN CAPITAL LETTER A WITH RING ABOVE
101        '\u{0000C9}' => 0x90, // LATIN CAPITAL LETTER E WITH ACUTE
102        '\u{0000E6}' => 0x91, // LATIN SMALL LETTER AE
103        '\u{0000C6}' => 0x92, // LATIN CAPITAL LETTER AE
104        '\u{0000F4}' => 0x93, // LATIN SMALL LETTER O WITH CIRCUMFLEX
105        '\u{0000F6}' => 0x94, // LATIN SMALL LETTER O WITH DIAERESIS
106        '\u{0000F2}' => 0x95, // LATIN SMALL LETTER O WITH GRAVE
107        '\u{0000FB}' => 0x96, // LATIN SMALL LETTER U WITH CIRCUMFLEX
108        '\u{0000F9}' => 0x97, // LATIN SMALL LETTER U WITH GRAVE
109        '\u{0000FF}' => 0x98, // LATIN SMALL LETTER Y WITH DIAERESIS
110        '\u{0000D6}' => 0x99, // LATIN CAPITAL LETTER O WITH DIAERESIS
111        '\u{0000DC}' => 0x9A, // LATIN CAPITAL LETTER U WITH DIAERESIS
112        '\u{0000A2}' => 0x9B, // CENT SIGN
113        '\u{0000A3}' => 0x9C, // POUND SIGN
114        '\u{0000A5}' => 0x9D, // YEN SIGN
115        '\u{0020A7}' => 0x9E, // PESETA SIGN
116        '\u{000192}' => 0x9F, // LATIN SMALL LETTER F WITH HOOK
117        '\u{0000E1}' => 0xA0, // LATIN SMALL LETTER A WITH ACUTE
118        '\u{0000ED}' => 0xA1, // LATIN SMALL LETTER I WITH ACUTE
119        '\u{0000F3}' => 0xA2, // LATIN SMALL LETTER O WITH ACUTE
120        '\u{0000FA}' => 0xA3, // LATIN SMALL LETTER U WITH ACUTE
121        '\u{0000F1}' => 0xA4, // LATIN SMALL LETTER N WITH TILDE
122        '\u{0000D1}' => 0xA5, // LATIN CAPITAL LETTER N WITH TILDE
123        '\u{0000AA}' => 0xA6, // FEMININE ORDINAL INDICATOR
124        '\u{0000BA}' => 0xA7, // MASCULINE ORDINAL INDICATOR
125        '\u{0000BF}' => 0xA8, // INVERTED QUESTION MARK
126        '\u{002310}' => 0xA9, // REVERSED NOT SIGN
127        '\u{0000AC}' => 0xAA, // NOT SIGN
128        '\u{0000BD}' => 0xAB, // VULGAR FRACTION ONE HALF
129        '\u{0000BC}' => 0xAC, // VULGAR FRACTION ONE QUARTER
130        '\u{0000A1}' => 0xAD, // INVERTED EXCLAMATION MARK
131        '\u{0000AB}' => 0xAE, // LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
132        '\u{0000BB}' => 0xAF, // RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
133        '\u{002591}' => 0xB0, // LIGHT SHADE
134        '\u{002592}' => 0xB1, // MEDIUM SHADE
135        '\u{002593}' => 0xB2, // DARK SHADE
136        '\u{002502}' => 0xB3, // BOX DRAWINGS LIGHT VERTICAL
137        '\u{002524}' => 0xB4, // BOX DRAWINGS LIGHT VERTICAL AND LEFT
138        '\u{002561}' => 0xB5, // BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
139        '\u{002562}' => 0xB6, // BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
140        '\u{002556}' => 0xB7, // BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
141        '\u{002555}' => 0xB8, // BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
142        '\u{002563}' => 0xB9, // BOX DRAWINGS DOUBLE VERTICAL AND LEFT
143        '\u{002551}' => 0xBA, // BOX DRAWINGS DOUBLE VERTICAL
144        '\u{002557}' => 0xBB, // BOX DRAWINGS DOUBLE DOWN AND LEFT
145        '\u{00255D}' => 0xBC, // BOX DRAWINGS DOUBLE UP AND LEFT
146        '\u{00255C}' => 0xBD, // BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
147        '\u{00255B}' => 0xBE, // BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
148        '\u{002510}' => 0xBF, // BOX DRAWINGS LIGHT DOWN AND LEFT
149        '\u{002514}' => 0xC0, // BOX DRAWINGS LIGHT UP AND RIGHT
150        '\u{002534}' => 0xC1, // BOX DRAWINGS LIGHT UP AND HORIZONTAL
151        '\u{00252C}' => 0xC2, // BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
152        '\u{00251C}' => 0xC3, // BOX DRAWINGS LIGHT VERTICAL AND RIGHT
153        '\u{002500}' => 0xC4, // BOX DRAWINGS LIGHT HORIZONTAL
154        '\u{00253C}' => 0xC5, // BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
155        '\u{00255E}' => 0xC6, // BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
156        '\u{00255F}' => 0xC7, // BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
157        '\u{00255A}' => 0xC8, // BOX DRAWINGS DOUBLE UP AND RIGHT
158        '\u{002554}' => 0xC9, // BOX DRAWINGS DOUBLE DOWN AND RIGHT
159        '\u{002569}' => 0xCA, // BOX DRAWINGS DOUBLE UP AND HORIZONTAL
160        '\u{002566}' => 0xCB, // BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
161        '\u{002560}' => 0xCC, // BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
162        '\u{002550}' => 0xCD, // BOX DRAWINGS DOUBLE HORIZONTAL
163        '\u{00256C}' => 0xCE, // BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
164        '\u{002567}' => 0xCF, // BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
165        '\u{002568}' => 0xD0, // BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
166        '\u{002564}' => 0xD1, // BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
167        '\u{002565}' => 0xD2, // BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
168        '\u{002559}' => 0xD3, // BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
169        '\u{002558}' => 0xD4, // BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
170        '\u{002552}' => 0xD5, // BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
171        '\u{002553}' => 0xD6, // BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
172        '\u{00256B}' => 0xD7, // BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
173        '\u{00256A}' => 0xD8, // BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
174        '\u{002518}' => 0xD9, // BOX DRAWINGS LIGHT UP AND LEFT
175        '\u{00250C}' => 0xDA, // BOX DRAWINGS LIGHT DOWN AND RIGHT
176        '\u{002588}' => 0xDB, // FULL BLOCK
177        '\u{002584}' => 0xDC, // LOWER HALF BLOCK
178        '\u{00258C}' => 0xDD, // LEFT HALF BLOCK
179        '\u{002590}' => 0xDE, // RIGHT HALF BLOCK
180        '\u{002580}' => 0xDF, // UPPER HALF BLOCK
181        '\u{0003B1}' => 0xE0, // GREEK SMALL LETTER ALPHA
182        '\u{0000DF}' => 0xE1, // LATIN SMALL LETTER SHARP S
183        '\u{000393}' => 0xE2, // GREEK CAPITAL LETTER GAMMA
184        '\u{0003C0}' => 0xE3, // GREEK SMALL LETTER PI
185        '\u{0003A3}' => 0xE4, // GREEK CAPITAL LETTER SIGMA
186        '\u{0003C3}' => 0xE5, // GREEK SMALL LETTER SIGMA
187        '\u{0000B5}' => 0xE6, // MICRO SIGN
188        '\u{0003C4}' => 0xE7, // GREEK SMALL LETTER TAU
189        '\u{0003A6}' => 0xE8, // GREEK CAPITAL LETTER PHI
190        '\u{000398}' => 0xE9, // GREEK CAPITAL LETTER THETA
191        '\u{0003A9}' => 0xEA, // GREEK CAPITAL LETTER OMEGA
192        '\u{0003B4}' => 0xEB, // GREEK SMALL LETTER DELTA
193        '\u{00221E}' => 0xEC, // INFINITY
194        '\u{0003C6}' => 0xED, // GREEK SMALL LETTER PHI
195        '\u{0003B5}' => 0xEE, // GREEK SMALL LETTER EPSILON
196        '\u{002229}' => 0xEF, // INTERSECTION
197        '\u{002261}' => 0xF0, // IDENTICAL TO
198        '\u{0000B1}' => 0xF1, // PLUS-MINUS SIGN
199        '\u{002265}' => 0xF2, // GREATER-THAN OR EQUAL TO
200        '\u{002264}' => 0xF3, // LESS-THAN OR EQUAL TO
201        '\u{002320}' => 0xF4, // TOP HALF INTEGRAL
202        '\u{002321}' => 0xF5, // BOTTOM HALF INTEGRAL
203        '\u{0000F7}' => 0xF6, // DIVISION SIGN
204        '\u{002248}' => 0xF7, // ALMOST EQUAL TO
205        '\u{0000B0}' => 0xF8, // DEGREE SIGN
206        '\u{002219}' => 0xF9, // BULLET OPERATOR
207        '\u{0000B7}' => 0xFA, // MIDDLE DOT
208        '\u{00221A}' => 0xFB, // SQUARE ROOT
209        '\u{00207F}' => 0xFC, // SUPERSCRIPT LATIN SMALL LETTER N
210        '\u{0000B2}' => 0xFD, // SUPERSCRIPT TWO
211        '\u{0025A0}' => 0xFE, // BLACK SQUARE
212        '\u{0000A0}' => 0xFF, // NO-BREAK SPACE
213
214        // Variants
215        '\u{0000A6}' => 0x7C, // BROKEN BAR
216        '\u{000394}' => 0x7F, // Greek capital delta
217        '\u{0003B2}' => 0xE1, // Greek small beta
218        '\u{0003A0}' => 0xE3, // Greek capital pi
219        '\u{00220F}' => 0xE3, // n-ary product sign
220        '\u{002211}' => 0xE4, // n-ary summation sign
221        '\u{0003BC}' => 0xE6, // Mu Small
222        '\u{0000F0}' => 0xEB, // small eth
223        '\u{002202}' => 0xEB, // partial derivative sign
224        '\u{0003D5}' => 0xED, // Phi Small (Closed Form)
225        '\u{01D719}' => 0xED, // Italicized Phi Small (Closed Form)
226        '\u{002205}' => 0xED, // empty set sign
227        '\u{002300}' => 0xED, // diameter sign
228        '\u{0000D8}' => 0xED, // Capital Latin letter O with stroke
229        '\u{0000F8}' => 0xED, // Lowercase Latin letter O with stroke
230        '\u{002208}' => 0xEE, // element-of sign
231        '\u{0020AC}' => 0xEE, // euro sign
232        '\u{002713}' => 0xFB, // check mark
233        '\u{002007}' => 0xFF, // FIGURE SPACE
234        '\u{00202F}' => 0xFF, // NARROW NO-BREAK SPACE
235
236        c => {
237            // Overlapping code points
238            if c == '\u{00}' || (c > '\u{1F}' && c < '\u{7F}') {
239                c as u8
240            } else {
241                return None;
242            }
243        }
244    })
245}