Escape LF in board file, refuse to store or print control chars

This commit is contained in:
Sasha Koshka 2024-10-11 16:54:56 -04:00
parent 31d7c63114
commit d921a2b144

View File

@ -1,3 +1,4 @@
use ascii;
use bufio; use bufio;
use fs; use fs;
use fmt; use fmt;
@ -40,8 +41,37 @@ export fn read(output: io::handle, board: str, number: int) (void | error) = {
// we add 1 to account for the blank line that will always be at the // we add 1 to account for the blank line that will always be at the
// bottom // bottom
seek_to_nth_last_line(file, number + 1)?; seek_to_nth_last_line(file, number + 1)?;
// TODO don't copy control characters!
io::copy(output, file)?; static let output_wbuf: [os::BUFSZ]u8 = [0...];
let output = bufio::init(output, [], output_wbuf);
let file = bufio::newscanner(file);
defer bufio::finish(&file);
let saw_escape = false;
for (true) {
let byte = match (bufio::scan_byte(&file)?) {
case let byte: u8 => yield byte;
case io::EOF => break;
};
if (byte == '\x1b') {
saw_escape = true;
} else {
if (byte == '\n') {
if (saw_escape) {
fmt::fprint(&output, "\n ")?;
} else {
fmt::fprint(&output, "\n")?;
};
} else if (!ascii::iscntrl(byte: rune)) {
let fake_buffer: [1]u8 = [byte];
io::write(&output, fake_buffer)?;
};
saw_escape = false;
};
};
bufio::flush(&output)?;
}; };
export fn post(input: io::handle, board: str, user_name: (str | void)) (void | error) = { export fn post(input: io::handle, board: str, user_name: (str | void)) (void | error) = {
@ -56,27 +86,26 @@ export fn post(input: io::handle, board: str, user_name: (str | void)) (void | e
}; };
static let file_wbuf: [os::BUFSZ]u8 = [0...]; static let file_wbuf: [os::BUFSZ]u8 = [0...];
let file = bufio::init(file, [], file_wbuf); let file = bufio::init(file, [], file_wbuf);
let scanner = bufio::newscanner(input); let input = bufio::newscanner(input);
defer bufio::finish(&scanner); defer bufio::finish(&input);
let saw_break = false; let saw_break = false;
fmt::fprintf(&file, "{}: ", user)?; fmt::fprintf(&file, "{}: ", user)?;
for (true) { for (true) {
let byte = match (bufio::scan_byte(&scanner)?) { let byte = match (bufio::scan_byte(&input)?) {
case let byte: u8 => yield byte; case let byte: u8 => yield byte;
case io::EOF => break; case io::EOF => break;
}; };
if (saw_break) { if (saw_break) {
fmt::fprint(&file, "\n ")?; fmt::fprint(&file, "\x1b\n")?;
saw_break = false; saw_break = false;
}; };
switch (byte) { if (byte == '\n') {
case '\n' =>
saw_break = true; saw_break = true;
case => } else if (!ascii::iscntrl(byte: rune)) {
let fake_buffer: [1]u8 = [byte]; let fake_buffer: [1]u8 = [byte];
io::write(&file, fake_buffer)?; io::write(&file, fake_buffer)?;
}; };