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}