From 076eeff3eaa76700e0ce8a4835c26aca46726bd0 Mon Sep 17 00:00:00 2001
From: Andrew Gallant <jamslam@gmail.com>
Date: Fri, 5 Aug 2016 00:10:58 -0400
Subject: [PATCH] update

---
 grep/src/search.rs | 20 ++++++++++++++++----
 src/main.rs        | 16 +++++++++++-----
 2 files changed, 27 insertions(+), 9 deletions(-)

diff --git a/grep/src/search.rs b/grep/src/search.rs
index 915acf83..e54a4b22 100644
--- a/grep/src/search.rs
+++ b/grep/src/search.rs
@@ -366,7 +366,6 @@ impl<'g, R: io::Read> GrepBuffered<'g, R> {
         let nread = try!(self.rdr.read(&mut self.b.buf[self.b.tmp.len()..]));
         // Now update our various positions.
         self.pos += self.start;
-        println!("start: {:?}, pos: {:?}", self.start, self.pos);
         self.start = 0;
         // The end is the total number of bytes read plus whatever we had for
         // leftovers.
@@ -460,18 +459,31 @@ fn s(bytes: &[u8]) -> String {
 mod tests {
     #![allow(unused_imports)]
 
+    use memchr::{memchr, memrchr};
+    use regex::bytes::Regex;
+
     use super::{Buffer, GrepBuilder, s};
 
     static SHERLOCK: &'static [u8] = include_bytes!("./data/sherlock.txt");
 
     #[test]
     fn buffered() {
+        // Find the expected number of matches and the position of the last
+        // match.
+        let re = Regex::new("Sherlock Holmes").unwrap();
+        let ms: Vec<_> = re.find_iter(SHERLOCK).collect();
+        let expected_count = ms.len();
+        let (start, end) = *ms.last().unwrap();
+        let start = memrchr(b'\n', &SHERLOCK[..start]).unwrap() + 1;
+        let end = memchr(b'\n', &SHERLOCK[end..]).unwrap() + end;
+
+        // Now compare it with what Grep finds.
         let g = GrepBuilder::new("Sherlock Holmes").create().unwrap();
         let mut bg = g.buffered_reader(Buffer::new(), SHERLOCK);
         let ms: Vec<_> = bg.iter().map(|r| r.unwrap()).collect();
         let m = ms.last().unwrap();
-        assert_eq!(91, ms.len());
-        assert_eq!(575707, m.start());
-        assert_eq!(575784, m.end());
+        assert_eq!(expected_count, ms.len());
+        assert_eq!(start, m.start());
+        assert_eq!(end, m.end());
     }
 }
diff --git a/src/main.rs b/src/main.rs
index d93496d1..999b6d98 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -50,13 +50,18 @@ fn run(args: &Args) -> Result<u64> {
     if args.arg_file.is_empty() {
         unimplemented!()
     } else {
-        let searcher =
-            try!(GrepBuilder::new(&args.arg_pattern).create());
-        run_mmap(args, &searcher)
+        let searcher = try!(GrepBuilder::new(&args.arg_pattern).create());
+        if args.flag_count {
+            run_mmap_count_only(args, &searcher)
+        } else {
+            run_mmap(args, &searcher)
+        }
     }
 }
 
 fn run_mmap(args: &Args, searcher: &Grep) -> Result<u64> {
+    unimplemented!()
+    /*
     for m in searcher.iter(text) {
         if !args.flag_count {
             try!(wtr.write(&text[m.start()..m.end()]));
@@ -65,17 +70,18 @@ fn run_mmap(args: &Args, searcher: &Grep) -> Result<u64> {
         count += 1;
     }
     Ok(count)
+    */
 }
 
 #[inline(never)]
-fn run_mmap_count_only(args: &Args, searcher: &LineSearcher) -> Result<u64> {
+fn run_mmap_count_only(args: &Args, searcher: &Grep) -> Result<u64> {
     use memmap::{Mmap, Protection};
 
     assert!(args.arg_file.len() == 1);
     let mut wtr = io::BufWriter::new(io::stdout());
     let mmap = try!(Mmap::open_path(&args.arg_file[0], Protection::Read));
     let text = unsafe { mmap.as_slice() };
-    let count = searcher.search(text).last().map_or(0, |m| m.count + 1);
+    let count = searcher.iter(text).count() as u64;
     try!(writeln!(wtr, "{}", count));
     Ok(count)
 }