sample-code/ascii.cl: Make it cooler

- Compute char value of digit
- Substitute C0 control codes for Unicode C0 Control Pictures
- Extend through Unicode Latin-1 Supplement
- Blank out C1 control code range
This commit is contained in:
John 2024-07-27 19:34:37 -05:00
parent 7f7836877e
commit 8c0ae02a71

48
sample-code/ascii.cl Normal file → Executable file
View File

@ -1,28 +1,50 @@
#!/usr/bin/env -S conlang -r false
//! Prints out the characters in the ASCII printable range //! Prints out the characters in the ASCII printable range
//! in the format of a hex-dump //! and the Latin-1 supplement in the format of a hex-dump
// TODO: Convenient stuff like this in the stdlib fn main () {
const HEX_LUT: [char; 16] = [ ascii()
'0', '1', '2', '3', // }
'4', '5', '6', '7', //
'8', '9', 'a', 'b', // fn n_digit(n: u32) -> char {
'c', 'd', 'e', 'f', // (if n > 9 {
]; n - 10 + ('a' as u32)
} else {
n + ('0' as u32)
}) as char
}
fn in_range(num: u32, start: u32, end: u32) -> bool {
(start <= i) && (i <= end )
}
fn ascii() { fn ascii() {
for row in 0..6 { for row in 0..16 {
for col in 0..16 { for col in 0..16 {
if col == 8 { if col == 8 {
print(' ') print(' ')
} }
let i = 0x20 + row * 16 + col let i = row * 16 + col
print(HEX_LUT[(i >> 4) & 0xf], HEX_LUT[i & 0xf], ' ') print(n_digit((i >> 4) & 0xf), n_digit(i & 0xf), ' ')
} }
print(" |") print(" |")
for col in 0..16 { for col in 0..16 {
let i = 0x20 + row * 16 + col let i = row * 16 + col
print(i as char) print(ascii_picture(i))
} }
println("|") println("|")
} }
} }
// Start of the C0 control pictures region
const CO_CONTROL_PICTURES: u32 = '\u{2400}' as u32;
fn ascii_picture(c: i32) -> char {
if c < ' ' as i32 { // C0
(CO_CONTROL_PICTURES + c) as char
} else if c == 127 { // C0:DEL
'' // SYMBOL_FOR_DELETE
} else if c.in_range(0x7f, 0xa0) { // C1
' '
} else c as char
}