summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-07-10 21:31:09 +0300
committerLars Wirzenius <liw@liw.fi>2018-07-10 21:31:09 +0300
commit0bb405da5f3430a7ed9736c5a5183d231eeb0adc (patch)
treebc82a78314ee9ca6475fad56e0cc9af0f4914703
downloadwc2-0bb405da5f3430a7ed9736c5a5183d231eeb0adc.tar.gz
Initial commit
-rw-r--r--.gitignore3
-rw-r--r--Cargo.toml6
-rw-r--r--src/main.rs55
3 files changed, 64 insertions, 0 deletions
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..d042c29
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "wc2"
+version = "0.1.0"
+authors = ["Lars Wirzenius <liw@liw.fi>"]
+
+[dependencies]
diff --git a/src/main.rs b/src/main.rs
new file mode 100644
index 0000000..bed40d9
--- /dev/null
+++ b/src/main.rs
@@ -0,0 +1,55 @@
+use std::env;
+use std::fs::File;
+use std::io;
+use std::io::BufRead;
+use std::result::Result;
+
+
+struct Count {
+ lines: usize,
+ words: usize,
+ chars: usize,
+}
+
+
+fn main() -> Result<(), io::Error> {
+ for filename in env::args().skip(1) {
+ let mut f = File::open(&filename)?;
+ let mut reader = io::BufReader::new(f);
+ let c = wc(&mut reader)?;
+ println!("{:>5} {:>5} {:>5} {}", c.lines, c.words, c.chars, filename);
+ }
+ Ok(())
+}
+
+
+fn wc(reader: &mut io::BufReader<File>) -> Result<Count, io::Error> {
+ let mut count = Count {lines: 0, words: 0, chars: 0};
+ for line in reader.lines() {
+ let line = line?;
+ count_line(&line, &mut count);
+ }
+ Ok(count)
+}
+
+
+fn count_line(line: &str, count: &mut Count) {
+ // we have a line!
+ count.lines += 1;
+
+ // add +1 for newline, which we ASSUME is there
+ count.chars += line.chars().count() + 1;
+
+ // count words
+ let mut in_word: bool = false;
+ for c in line.chars() {
+ if c.is_alphabetic() {
+ if !in_word {
+ in_word = true;
+ count.words += 1;
+ }
+ } else {
+ in_word = false;
+ }
+ }
+}