summaryrefslogtreecommitdiff
path: root/src/main.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/main.rs')
-rw-r--r--src/main.rs55
1 files changed, 55 insertions, 0 deletions
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;
+ }
+ }
+}