From cf32fe3327ba3af871bfecc37bb6a11d1bb1ccf5 Mon Sep 17 00:00:00 2001 From: Lars Wirzenius Date: Sun, 27 May 2018 11:40:55 +0300 Subject: Add: rudimentary wc --- .gitignore | 3 +++ Cargo.toml | 6 ++++++ src/main.rs | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ test.txt | 3 +++ 4 files changed, 80 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.toml create mode 100644 src/main.rs create mode 100644 test.txt diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..70e3cae --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ + +/target +**/*.rs.bk diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..48e34ae --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "wc" +version = "0.1.0" +authors = ["Lars Wirzenius "] + +[dependencies] diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..50d3663 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,68 @@ +use std::env; +use std::fs::File; +use std::io::prelude::*; + +const BUFSIZE: usize = 128; +const NL: u8 = 10; +const SPACE: u8 = 32; + +fn main() { + for filename in env::args().skip(1) { + let mut f = File::open(&filename).unwrap(); + let (l, w, c) = wc(&mut f); + println!("{} {} {} {}", l, w, c, filename); + } +} + + +fn wc(f: &mut File) -> (usize, usize, usize) { + let mut buffer = vec![0; BUFSIZE]; + let mut chars: usize = 0; + let mut lines: usize = 0; + let mut words: usize = 0; + let mut inword = false; + + loop { + match f.read(&mut buffer).unwrap() { + 0 => break, + n => { + chars += n; + lines += count_newlines(&buffer, n); + words += count_words(&buffer, n, &mut inword); + } + }; + } + (lines, words, chars) +} + + +fn count_newlines(buf: &[u8], len: usize) -> usize{ + let mut i = 0; + let mut n = 0; + while i < len { + if buf[i] == NL { + n += 1; + } + i += 1; + } + n +} + + +fn count_words(buf: &[u8], len: usize, inword: &mut bool) -> usize { + let mut n = 0; + let mut i = 0; + + while i < len { + if buf[i] == NL || buf[i] == SPACE { + *inword = false; + } else { + if !*inword { + *inword = true; + n += 1; + } + } + i += 1; + } + n +} diff --git a/test.txt b/test.txt new file mode 100644 index 0000000..720da0f --- /dev/null +++ b/test.txt @@ -0,0 +1,3 @@ +töttörööt +second +third line -- cgit v1.2.1