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) = {
 | 
				
			||||||
@ -57,26 +87,25 @@ 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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user