summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-05-27 11:40:55 +0300
committerLars Wirzenius <liw@liw.fi>2018-05-27 11:40:55 +0300
commitcf32fe3327ba3af871bfecc37bb6a11d1bb1ccf5 (patch)
tree18a3ee13af41ba091cee819982da0eabdc4e5755
downloadwc-cf32fe3327ba3af871bfecc37bb6a11d1bb1ccf5.tar.gz
Add: rudimentary wcHEADmaster
-rw-r--r--.gitignore3
-rw-r--r--Cargo.toml6
-rw-r--r--src/main.rs68
-rw-r--r--test.txt3
4 files changed, 80 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..48e34ae
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,6 @@
+[package]
+name = "wc"
+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..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