1
Fork 0
mirror of https://github.com/RGBCube/uutils-coreutils synced 2025-08-01 13:37:48 +00:00

Avoid using char() in tr

This commit is contained in:
Florian Gilcher 2016-03-22 21:59:53 +01:00
parent 2befeef179
commit 0be3e61d9f

View file

@ -1,5 +1,4 @@
#![crate_name = "uu_tr"] #![crate_name = "uu_tr"]
#![feature(io)]
/* /*
* This file is part of the uutils coreutils package. * This file is part of the uutils coreutils package.
@ -21,7 +20,7 @@ extern crate uucore;
use bit_set::BitSet; use bit_set::BitSet;
use getopts::Options; use getopts::Options;
use std::io::{stdin, stdout, BufReader, Read, Write}; use std::io::{stdin, stdout, BufReader, BufWriter, Read, Write};
use vec_map::VecMap; use vec_map::VecMap;
use expand::ExpandSet; use expand::ExpandSet;
@ -49,25 +48,22 @@ fn delete(set: ExpandSet, complement: bool) {
} }
}; };
for c in BufReader::new(stdin()).chars() { let mut reader = BufReader::new(stdin());
match c {
Ok(c) if is_allowed(c) => buf.push(c), while let Ok(length) = reader.read_to_string(&mut buf) {
Ok(_) => (), if length == 0 { break }
Err(err) => panic!("{}", err),
}; let filtered = buf.chars()
if buf.len() >= BUFFER_LEN { .filter(|c| { is_allowed(*c) })
safe_unwrap!(stdout.write_all(&buf[..].as_bytes())); .collect::<String>();
} safe_unwrap!(stdout.write_all(filtered.as_bytes()));
} buf.clear();
if !buf.is_empty() {
safe_unwrap!(stdout.write_all(&buf[..].as_bytes()));
pipe_flush!();
} }
} }
fn tr<'a>(set1: ExpandSet<'a>, mut set2: ExpandSet<'a>) { fn tr<'a>(set1: ExpandSet<'a>, mut set2: ExpandSet<'a>) {
let mut map = VecMap::new(); let mut map = VecMap::new();
let mut stdout = stdout(); let stdout = stdout();
let mut buf = String::with_capacity(BUFFER_LEN + 4); let mut buf = String::with_capacity(BUFFER_LEN + 4);
let mut s2_prev = '_'; let mut s2_prev = '_';
@ -77,27 +73,25 @@ fn tr<'a>(set1: ExpandSet<'a>, mut set2: ExpandSet<'a>) {
map.insert(i as usize, s2_prev); map.insert(i as usize, s2_prev);
} }
for c in BufReader::new(stdin()).chars() { let mut reader = BufReader::new(stdin());
match c { let mut writer = BufWriter::new(stdout);
Ok(inc) => {
let trc = match map.get(&(inc as usize)) { while let Ok(length) = reader.read_to_string(&mut buf) {
if length == 0 { break }
{
let mut chars = buf.chars();
while let Some(char) = chars.next() {
let trc = match map.get(&(char as usize)) {
Some(t) => *t, Some(t) => *t,
None => inc, None => char,
}; };
buf.push(trc); safe_unwrap!(writer.write_all(format!("{}", trc).as_ref()));
if buf.len() >= BUFFER_LEN {
safe_unwrap!(stdout.write_all(&buf[..].as_bytes()));
buf.truncate(0);
}
}
Err(err) => {
panic!("{}", err);
} }
} }
}
if !buf.is_empty() { buf.clear();
safe_unwrap!(stdout.write_all(&buf[..].as_bytes()));
pipe_flush!();
} }
} }