diff --git a/Makefile b/Makefile index 465276849..cc9b91999 100644 --- a/Makefile +++ b/Makefile @@ -160,7 +160,7 @@ build/uutils: uutils/uutils.rs build/mkuutils $(addprefix build/, $(addsuffix .t $(RUSTC) $(RUSTCFLAGS) -L build/ --dep-info $@.d build/gen/uutils.rs -o $@ # Dependencies -LIBCRYPTO = $(shell $(RUSTC) --print-file-name --crate-type rlib deps/rust-crypto/src/rust-crypto/lib.rs) +LIBCRYPTO := $(shell $(RUSTC) --print-file-name --crate-type rlib deps/rust-crypto/src/rust-crypto/lib.rs) -include build/rust-crypto.d build/$(LIBCRYPTO): | build $(RUSTC) $(RUSTCFLAGS) --crate-type rlib --dep-info build/rust-crypto.d deps/rust-crypto/src/rust-crypto/lib.rs --out-dir build/ @@ -171,7 +171,10 @@ build/mkmain: mkmain.rs | build build/mkuutils: mkuutils.rs | build $(RUSTC) $(RUSTCFLAGS) -L build mkuutils.rs -o $@ -deps: build/$(LIBCRYPTO) +cksum/crc_table.rs: cksum/gen_table.rs + cd cksum && $(RUSTC) $(RUSTCFLAGS) gen_table.rs && ./gen_table && $(RM) gen_table + +deps: build/$(LIBCRYPTO) cksum/crc_table.rs crates: echo $(EXES) diff --git a/cksum/cksum.rs b/cksum/cksum.rs index 2757e447b..8c0478321 100644 --- a/cksum/cksum.rs +++ b/cksum/cksum.rs @@ -12,30 +12,26 @@ extern crate getopts; -use std::io::{BufferedReader, EndOfFile, File, IoError, IoResult, print}; -use std::io::stdio::stdin; +use std::io::{EndOfFile, File, IoError, IoResult, print}; +use std::io::stdio::stdin_raw; +use std::mem; + +use crc_table::CRC_TABLE; #[path="../common/util.rs"] mod util; -static NAME : &'static str = "cksum"; -static VERSION : &'static str = "1.0.0"; +mod crc_table; -fn crc_update(mut crc: u32, input: u8) -> u32 { - crc ^= input as u32 << 24; +static NAME: &'static str = "cksum"; +static VERSION: &'static str = "1.0.0"; - for _ in range(0u, 8) { - if crc & 0x80000000 != 0 { - crc <<= 1; - crc ^= 0x04c11db7; - } else { - crc <<= 1; - } - } - - crc +#[inline] +fn crc_update(crc: u32, input: u8) -> u32 { + (crc << 8) ^ CRC_TABLE[((crc >> 24) as uint ^ input as uint) & 0xFF] } +#[inline] fn crc_final(mut crc: u32, mut length: uint) -> u32 { while length != 0 { crc = crc_update(crc, length as u8); @@ -50,11 +46,14 @@ fn cksum(fname: &str) -> IoResult<(u32, uint)> { let mut size = 0u; let mut rd = try!(open_file(fname)); + let mut bytes: [u8, ..1024 * 1024] = unsafe { mem::uninitialized() }; loop { - match rd.read_byte() { - Ok(b) => { - crc = crc_update(crc, b); - size += 1; + match rd.read(bytes) { + Ok(num_bytes) => { + for &b in bytes.iter().take(num_bytes) { + crc = crc_update(crc, b); + } + size += num_bytes; } Err(err) => { return match err { @@ -68,10 +67,10 @@ fn cksum(fname: &str) -> IoResult<(u32, uint)> { fn open_file(name: &str) -> IoResult> { match name { - "-" => Ok(box stdin() as Box), + "-" => Ok(box stdin_raw() as Box), _ => { let f = try!(File::open(&Path::new(name))); - Ok(box BufferedReader::new(f) as Box) + Ok(box f as Box) } } } diff --git a/cksum/crc_table.rs b/cksum/crc_table.rs new file mode 100644 index 000000000..a810d89cc --- /dev/null +++ b/cksum/crc_table.rs @@ -0,0 +1,3 @@ +/* auto-generated (DO NOT EDIT) */ + +pub static CRC_TABLE: [u32, ..256] = [0, 79764919, 159529838, 222504665, 319059676, 398814059, 445009330, 507990021, 638119352, 583659535, 797628118, 726387553, 890018660, 835552979, 1015980042, 944750013, 1276238704, 1221641927, 1167319070, 1095957929, 1595256236, 1540665371, 1452775106, 1381403509, 1780037320, 1859660671, 1671105958, 1733955601, 2031960084, 2111593891, 1889500026, 1952343757, 2552477408, 2632100695, 2443283854, 2506133561, 2334638140, 2414271883, 2191915858, 2254759653, 3190512472, 3135915759, 3081330742, 3009969537, 2905550212, 2850959411, 2762807018, 2691435357, 3560074640, 3505614887, 3719321342, 3648080713, 3342211916, 3287746299, 3467911202, 3396681109, 4063920168, 4143685023, 4223187782, 4286162673, 3779000052, 3858754371, 3904687514, 3967668269, 881225847, 809987520, 1023691545, 969234094, 662832811, 591600412, 771767749, 717299826, 311336399, 374308984, 453813921, 533576470, 25881363, 88864420, 134795389, 214552010, 2023205639, 2086057648, 1897238633, 1976864222, 1804852699, 1867694188, 1645340341, 1724971778, 1587496639, 1516133128, 1461550545, 1406951526, 1302016099, 1230646740, 1142491917, 1087903418, 2896545431, 2825181984, 2770861561, 2716262478, 3215044683, 3143675388, 3055782693, 3001194130, 2326604591, 2389456536, 2200899649, 2280525302, 2578013683, 2640855108, 2418763421, 2498394922, 3769900519, 3832873040, 3912640137, 3992402750, 4088425275, 4151408268, 4197601365, 4277358050, 3334271071, 3263032808, 3476998961, 3422541446, 3585640067, 3514407732, 3694837229, 3640369242, 1762451694, 1842216281, 1619975040, 1682949687, 2047383090, 2127137669, 1938468188, 2001449195, 1325665622, 1271206113, 1183200824, 1111960463, 1543535498, 1489069629, 1434599652, 1363369299, 622672798, 568075817, 748617968, 677256519, 907627842, 853037301, 1067152940, 995781531, 51762726, 131386257, 177728840, 240578815, 269590778, 349224269, 429104020, 491947555, 4046411278, 4126034873, 4172115296, 4234965207, 3794477266, 3874110821, 3953728444, 4016571915, 3609705398, 3555108353, 3735388376, 3664026991, 3290680682, 3236090077, 3449943556, 3378572211, 3174993278, 3120533705, 3032266256, 2961025959, 2923101090, 2868635157, 2813903052, 2742672763, 2604032198, 2683796849, 2461293480, 2524268063, 2284983834, 2364738477, 2175806836, 2238787779, 1569362073, 1498123566, 1409854455, 1355396672, 1317987909, 1246755826, 1192025387, 1137557660, 2072149281, 2135122070, 1912620623, 1992383480, 1753615357, 1816598090, 1627664531, 1707420964, 295390185, 358241886, 404320391, 483945776, 43990325, 106832002, 186451547, 266083308, 932423249, 861060070, 1041341759, 986742920, 613929101, 542559546, 756411363, 701822548, 3316196985, 3244833742, 3425377559, 3370778784, 3601682597, 3530312978, 3744426955, 3689838204, 3819031489, 3881883254, 3928223919, 4007849240, 4037393693, 4100235434, 4180117107, 4259748804, 2310601993, 2373574846, 2151335527, 2231098320, 2596047829, 2659030626, 2470359227, 2550115596, 2947551409, 2876312838, 2788305887, 2733848168, 3165939309, 3094707162, 3040238851, 2985771188]; diff --git a/cksum/gen_table.rs b/cksum/gen_table.rs new file mode 100644 index 000000000..f1ca4257a --- /dev/null +++ b/cksum/gen_table.rs @@ -0,0 +1,41 @@ +/* +* This file is part of the uutils coreutils package. +* +* (c) Arcterus +* (c) Michael Gehring +* +* For the full copyright and license information, please view the LICENSE +* file that was distributed with this source code. +*/ + +use std::io; + +static CRC_TABLE_LEN: uint = 256; + +fn main() { + let mut table = Vec::with_capacity(CRC_TABLE_LEN); + for num in range(0, CRC_TABLE_LEN) { + table.push(crc_entry(num as u8) as u32); + } + let mut file = io::File::open_mode(&Path::new("crc_table.rs"), io::Truncate, io::Write).unwrap(); + let output = format!("/* auto-generated (DO NOT EDIT) */ + +pub static CRC_TABLE: [u32, ..{}] = {};", CRC_TABLE_LEN, table); + file.write_line(output.as_slice()).unwrap(); +} + +#[inline] +fn crc_entry(input: u8) -> u32 { + let mut crc = input as u32 << 24; + + for _ in range(0u, 8) { + if crc & 0x80000000 != 0 { + crc <<= 1; + crc ^= 0x04c11db7; + } else { + crc <<= 1; + } + } + + crc +}