Escape LF in board file, refuse to store or print control chars
This commit is contained in:
parent
31d7c63114
commit
d921a2b144
@ -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)?;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user