bstr: update everything to bstr 0.2

This commit is contained in:
Andrew Gallant 2019-06-26 16:47:33 -04:00
parent 34677d2622
commit b93762ea7a
No known key found for this signature in database
GPG Key ID: B2E3A4923F8B0D44
20 changed files with 72 additions and 72 deletions

14
Cargo.lock generated
View File

@ -38,7 +38,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
[[package]] [[package]]
name = "bstr" name = "bstr"
version = "0.1.4" version = "0.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
dependencies = [ dependencies = [
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
@ -145,7 +145,7 @@ name = "globset"
version = "0.4.3" version = "0.4.3"
dependencies = [ dependencies = [
"aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", "aho-corasick 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)",
"bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)", "fnv 1.0.6 (registry+https://github.com/rust-lang/crates.io-index)",
"glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "glob 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -171,7 +171,7 @@ name = "grep-cli"
version = "0.1.2" version = "0.1.2"
dependencies = [ dependencies = [
"atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", "atty 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)",
"bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"globset 0.4.3", "globset 0.4.3",
"lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
"log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", "log 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -202,7 +202,7 @@ name = "grep-printer"
version = "0.1.2" version = "0.1.2"
dependencies = [ dependencies = [
"base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", "base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)",
"bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"grep-matcher 0.1.2", "grep-matcher 0.1.2",
"grep-regex 0.1.3", "grep-regex 0.1.3",
"grep-searcher 0.1.4", "grep-searcher 0.1.4",
@ -229,7 +229,7 @@ dependencies = [
name = "grep-searcher" name = "grep-searcher"
version = "0.1.4" version = "0.1.4"
dependencies = [ dependencies = [
"bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", "bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs 0.8.17 (registry+https://github.com/rust-lang/crates.io-index)",
"encoding_rs_io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", "encoding_rs_io 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
@ -533,7 +533,7 @@ dependencies = [
name = "ripgrep" name = "ripgrep"
version = "11.0.1" version = "11.0.1"
dependencies = [ dependencies = [
"bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", "bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
"clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)",
"grep 0.2.4", "grep 0.2.4",
"ignore 0.4.7", "ignore 0.4.7",
@ -726,7 +726,7 @@ dependencies = [
"checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf" "checksum autocfg 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "0e49efa51329a5fd37e7c79db4621af617cd4e3e5bc224939808d076077077bf"
"checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e" "checksum base64 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0b25d992356d2eb0ed82172f5248873db5560c4721f564b13cb5193bda5e668e"
"checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd" "checksum bitflags 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "3d155346769a6855b86399e9bc3814ab343cd3d62c7e985113d46a0ec3c281fd"
"checksum bstr 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "59604ece62a407dc9164732e5adea02467898954c3a5811fd2dc140af14ef15b" "checksum bstr 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4b30b9697835ce3dd7f4c6f6d0952bbb64cdcd6fed2f29dc16fc0ffc39c684cd"
"checksum bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be0fdd54b507df8f22012890aadd099979befdba27713c767993f8380112ca7c" "checksum bytecount 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "be0fdd54b507df8f22012890aadd099979befdba27713c767993f8380112ca7c"
"checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5" "checksum byteorder 1.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a7c3dd8985a7111efc5c80b44e23ecdd8c007de8ade3b96595387e812b957cf5"
"checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d" "checksum cc 1.0.37 (registry+https://github.com/rust-lang/crates.io-index)" = "39f75544d7bbaf57560d2168f28fd649ff9c76153874db88bdbdfd839b1a7e7d"

View File

@ -46,7 +46,7 @@ members = [
] ]
[dependencies] [dependencies]
bstr = "0.1.2" bstr = "0.2.0"
grep = { version = "0.2.4", path = "grep" } grep = { version = "0.2.4", path = "grep" }
ignore = { version = "0.4.7", path = "ignore" } ignore = { version = "0.4.7", path = "ignore" }
lazy_static = "1.1.0" lazy_static = "1.1.0"

View File

@ -20,7 +20,7 @@ bench = false
[dependencies] [dependencies]
aho-corasick = "0.7.3" aho-corasick = "0.7.3"
bstr = { version = "0.1.2", default-features = false, features = ["std"] } bstr = { version = "0.2.0", default-features = false, features = ["std"] }
fnv = "1.0.6" fnv = "1.0.6"
log = "0.4.5" log = "0.4.5"
regex = "1.1.5" regex = "1.1.5"

View File

@ -120,7 +120,7 @@ impl GlobMatcher {
/// Tests whether the given path matches this pattern or not. /// Tests whether the given path matches this pattern or not.
pub fn is_match_candidate(&self, path: &Candidate) -> bool { pub fn is_match_candidate(&self, path: &Candidate) -> bool {
self.re.is_match(path.path.as_bytes()) self.re.is_match(&path.path)
} }
} }
@ -145,7 +145,7 @@ impl GlobStrategic {
/// Tests whether the given path matches this pattern or not. /// Tests whether the given path matches this pattern or not.
fn is_match_candidate(&self, candidate: &Candidate) -> bool { fn is_match_candidate(&self, candidate: &Candidate) -> bool {
let byte_path = candidate.path.as_bytes(); let byte_path = &*candidate.path;
match self.strategy { match self.strategy {
MatchStrategy::Literal(ref lit) => lit.as_bytes() == byte_path, MatchStrategy::Literal(ref lit) => lit.as_bytes() == byte_path,

View File

@ -119,7 +119,7 @@ use std::path::Path;
use std::str; use std::str;
use aho_corasick::AhoCorasick; use aho_corasick::AhoCorasick;
use bstr::{B, BStr, BString}; use bstr::{B, ByteSlice, ByteVec};
use regex::bytes::{Regex, RegexBuilder, RegexSet}; use regex::bytes::{Regex, RegexBuilder, RegexSet};
use pathutil::{file_name, file_name_ext, normalize_path}; use pathutil::{file_name, file_name_ext, normalize_path};
@ -490,15 +490,15 @@ impl GlobSetBuilder {
/// path against multiple globs or sets of globs. /// path against multiple globs or sets of globs.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct Candidate<'a> { pub struct Candidate<'a> {
path: Cow<'a, BStr>, path: Cow<'a, [u8]>,
basename: Cow<'a, BStr>, basename: Cow<'a, [u8]>,
ext: Cow<'a, BStr>, ext: Cow<'a, [u8]>,
} }
impl<'a> Candidate<'a> { impl<'a> Candidate<'a> {
/// Create a new candidate for matching from the given path. /// Create a new candidate for matching from the given path.
pub fn new<P: AsRef<Path> + ?Sized>(path: &'a P) -> Candidate<'a> { pub fn new<P: AsRef<Path> + ?Sized>(path: &'a P) -> Candidate<'a> {
let path = normalize_path(BString::from_path_lossy(path.as_ref())); let path = normalize_path(Vec::from_path_lossy(path.as_ref()));
let basename = file_name(&path).unwrap_or(Cow::Borrowed(B(""))); let basename = file_name(&path).unwrap_or(Cow::Borrowed(B("")));
let ext = file_name_ext(&basename).unwrap_or(Cow::Borrowed(B(""))); let ext = file_name_ext(&basename).unwrap_or(Cow::Borrowed(B("")));
Candidate { Candidate {
@ -508,7 +508,7 @@ impl<'a> Candidate<'a> {
} }
} }
fn path_prefix(&self, max: usize) -> &BStr { fn path_prefix(&self, max: usize) -> &[u8] {
if self.path.len() <= max { if self.path.len() <= max {
&*self.path &*self.path
} else { } else {
@ -516,7 +516,7 @@ impl<'a> Candidate<'a> {
} }
} }
fn path_suffix(&self, max: usize) -> &BStr { fn path_suffix(&self, max: usize) -> &[u8] {
if self.path.len() <= max { if self.path.len() <= max {
&*self.path &*self.path
} else { } else {

View File

@ -1,15 +1,15 @@
use std::borrow::Cow; use std::borrow::Cow;
use bstr::BStr; use bstr::{ByteSlice, ByteVec};
/// The final component of the path, if it is a normal file. /// The final component of the path, if it is a normal file.
/// ///
/// If the path terminates in ., .., or consists solely of a root of prefix, /// If the path terminates in ., .., or consists solely of a root of prefix,
/// file_name will return None. /// file_name will return None.
pub fn file_name<'a>(path: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> { pub fn file_name<'a>(path: &Cow<'a, [u8]>) -> Option<Cow<'a, [u8]>> {
if path.is_empty() { if path.is_empty() {
return None; return None;
} else if path.last() == Some(b'.') { } else if path.last_byte() == Some(b'.') {
return None; return None;
} }
let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0); let last_slash = path.rfind_byte(b'/').map(|i| i + 1).unwrap_or(0);
@ -39,7 +39,7 @@ pub fn file_name<'a>(path: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> {
/// a pattern like `*.rs` is obviously trying to match files with a `rs` /// a pattern like `*.rs` is obviously trying to match files with a `rs`
/// extension, but it also matches files like `.rs`, which doesn't have an /// extension, but it also matches files like `.rs`, which doesn't have an
/// extension according to std::path::Path::extension. /// extension according to std::path::Path::extension.
pub fn file_name_ext<'a>(name: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> { pub fn file_name_ext<'a>(name: &Cow<'a, [u8]>) -> Option<Cow<'a, [u8]>> {
if name.is_empty() { if name.is_empty() {
return None; return None;
} }
@ -60,7 +60,7 @@ pub fn file_name_ext<'a>(name: &Cow<'a, BStr>) -> Option<Cow<'a, BStr>> {
/// Normalizes a path to use `/` as a separator everywhere, even on platforms /// Normalizes a path to use `/` as a separator everywhere, even on platforms
/// that recognize other characters as separators. /// that recognize other characters as separators.
#[cfg(unix)] #[cfg(unix)]
pub fn normalize_path(path: Cow<BStr>) -> Cow<BStr> { pub fn normalize_path(path: Cow<[u8]>) -> Cow<[u8]> {
// UNIX only uses /, so we're good. // UNIX only uses /, so we're good.
path path
} }
@ -68,7 +68,7 @@ pub fn normalize_path(path: Cow<BStr>) -> Cow<BStr> {
/// Normalizes a path to use `/` as a separator everywhere, even on platforms /// Normalizes a path to use `/` as a separator everywhere, even on platforms
/// that recognize other characters as separators. /// that recognize other characters as separators.
#[cfg(not(unix))] #[cfg(not(unix))]
pub fn normalize_path(mut path: Cow<BStr>) -> Cow<BStr> { pub fn normalize_path(mut path: Cow<[u8]>) -> Cow<[u8]> {
use std::path::is_separator; use std::path::is_separator;
for i in 0..path.len() { for i in 0..path.len() {
@ -84,7 +84,7 @@ pub fn normalize_path(mut path: Cow<BStr>) -> Cow<BStr> {
mod tests { mod tests {
use std::borrow::Cow; use std::borrow::Cow;
use bstr::{B, BString}; use bstr::{B, ByteVec};
use super::{file_name_ext, normalize_path}; use super::{file_name_ext, normalize_path};
@ -92,7 +92,7 @@ mod tests {
($name:ident, $file_name:expr, $ext:expr) => { ($name:ident, $file_name:expr, $ext:expr) => {
#[test] #[test]
fn $name() { fn $name() {
let bs = BString::from($file_name); let bs = Vec::from($file_name);
let got = file_name_ext(&Cow::Owned(bs)); let got = file_name_ext(&Cow::Owned(bs));
assert_eq!($ext.map(|s| Cow::Borrowed(B(s))), got); assert_eq!($ext.map(|s| Cow::Borrowed(B(s))), got);
} }
@ -109,7 +109,7 @@ mod tests {
($name:ident, $path:expr, $expected:expr) => { ($name:ident, $path:expr, $expected:expr) => {
#[test] #[test]
fn $name() { fn $name() {
let bs = BString::from_slice($path); let bs = Vec::from_slice($path);
let got = normalize_path(Cow::Owned(bs)); let got = normalize_path(Cow::Owned(bs));
assert_eq!($expected.to_vec(), got.into_owned()); assert_eq!($expected.to_vec(), got.into_owned());
} }

View File

@ -14,7 +14,7 @@ license = "Unlicense/MIT"
[dependencies] [dependencies]
atty = "0.2.11" atty = "0.2.11"
bstr = "0.1.2" bstr = "0.2.0"
globset = { version = "0.4.3", path = "../globset" } globset = { version = "0.4.3", path = "../globset" }
lazy_static = "1.1.0" lazy_static = "1.1.0"
log = "0.4.5" log = "0.4.5"

View File

@ -1,7 +1,7 @@
use std::ffi::OsStr; use std::ffi::OsStr;
use std::str; use std::str;
use bstr::{BStr, BString}; use bstr::{ByteSlice, ByteVec};
/// A single state in the state machine used by `unescape`. /// A single state in the state machine used by `unescape`.
#[derive(Clone, Copy, Eq, PartialEq)] #[derive(Clone, Copy, Eq, PartialEq)]
@ -38,7 +38,6 @@ enum State {
/// assert_eq!(r"foo\nbar\xFFbaz", escape(b"foo\nbar\xFFbaz")); /// assert_eq!(r"foo\nbar\xFFbaz", escape(b"foo\nbar\xFFbaz"));
/// ``` /// ```
pub fn escape(bytes: &[u8]) -> String { pub fn escape(bytes: &[u8]) -> String {
let bytes = BStr::new(bytes);
let mut escaped = String::new(); let mut escaped = String::new();
for (s, e, ch) in bytes.char_indices() { for (s, e, ch) in bytes.char_indices() {
if ch == '\u{FFFD}' { if ch == '\u{FFFD}' {
@ -56,7 +55,7 @@ pub fn escape(bytes: &[u8]) -> String {
/// ///
/// This is like [`escape`](fn.escape.html), but accepts an OS string. /// This is like [`escape`](fn.escape.html), but accepts an OS string.
pub fn escape_os(string: &OsStr) -> String { pub fn escape_os(string: &OsStr) -> String {
escape(BString::from_os_str_lossy(string).as_bytes()) escape(Vec::from_os_str_lossy(string).as_bytes())
} }
/// Unescapes a string. /// Unescapes a string.

View File

@ -161,7 +161,7 @@ pub fn patterns_from_reader<R: io::Read>(rdr: R) -> io::Result<Vec<String>> {
let mut line_number = 0; let mut line_number = 0;
io::BufReader::new(rdr).for_byte_line(|line| { io::BufReader::new(rdr).for_byte_line(|line| {
line_number += 1; line_number += 1;
match pattern_from_bytes(line.as_bytes()) { match pattern_from_bytes(line) {
Ok(pattern) => { Ok(pattern) => {
patterns.push(pattern.to_string()); patterns.push(pattern.to_string());
Ok(true) Ok(true)

View File

@ -19,7 +19,7 @@ serde1 = ["base64", "serde", "serde_derive", "serde_json"]
[dependencies] [dependencies]
base64 = { version = "0.10.0", optional = true } base64 = { version = "0.10.0", optional = true }
bstr = "0.1.2" bstr = "0.2.0"
grep-matcher = { version = "0.1.2", path = "../grep-matcher" } grep-matcher = { version = "0.1.2", path = "../grep-matcher" }
grep-searcher = { version = "0.1.4", path = "../grep-searcher" } grep-searcher = { version = "0.1.4", path = "../grep-searcher" }
termcolor = "1.0.4" termcolor = "1.0.4"

View File

@ -5,7 +5,7 @@ use std::path::Path;
use std::sync::Arc; use std::sync::Arc;
use std::time::Instant; use std::time::Instant;
use bstr::BStr; use bstr::ByteSlice;
use grep_matcher::{Match, Matcher}; use grep_matcher::{Match, Matcher};
use grep_searcher::{ use grep_searcher::{
LineStep, Searcher, LineStep, Searcher,
@ -1274,7 +1274,7 @@ impl<'a, M: Matcher, W: WriteColor> StandardImpl<'a, M, W> {
) -> io::Result<()> { ) -> io::Result<()> {
if self.config().max_columns_preview { if self.config().max_columns_preview {
let original = line; let original = line;
let end = BStr::new(&bytes[line]) let end = bytes[line]
.grapheme_indices() .grapheme_indices()
.map(|(_, end, _)| end) .map(|(_, end, _)| end)
.take(self.config().max_columns.unwrap_or(0) as usize) .take(self.config().max_columns.unwrap_or(0) as usize)
@ -1396,7 +1396,7 @@ impl<'a, M: Matcher, W: WriteColor> StandardImpl<'a, M, W> {
} }
let remainder = format!( let remainder = format!(
"after match (found {:?} byte around offset {})\n", "after match (found {:?} byte around offset {})\n",
BStr::new(&[byte]), offset, [byte].as_bstr(), offset,
); );
self.write(remainder.as_bytes())?; self.write(remainder.as_bytes())?;
} else if let Some(byte) = bin.convert_byte() { } else if let Some(byte) = bin.convert_byte() {
@ -1407,7 +1407,7 @@ impl<'a, M: Matcher, W: WriteColor> StandardImpl<'a, M, W> {
} }
let remainder = format!( let remainder = format!(
"matches (found {:?} byte around offset {})\n", "matches (found {:?} byte around offset {})\n",
BStr::new(&[byte]), offset, [byte].as_bstr(), offset,
); );
self.write(remainder.as_bytes())?; self.write(remainder.as_bytes())?;
} }

View File

@ -4,7 +4,7 @@ use std::io;
use std::path::Path; use std::path::Path;
use std::time; use std::time;
use bstr::{BStr, BString}; use bstr::{ByteSlice, ByteVec};
use grep_matcher::{Captures, LineTerminator, Match, Matcher}; use grep_matcher::{Captures, LineTerminator, Match, Matcher};
use grep_searcher::{ use grep_searcher::{
LineIter, LineIter,
@ -263,12 +263,12 @@ impl<'a> Sunk<'a> {
/// portability with a small cost: on Windows, paths that are not valid UTF-16 /// portability with a small cost: on Windows, paths that are not valid UTF-16
/// will not roundtrip correctly. /// will not roundtrip correctly.
#[derive(Clone, Debug)] #[derive(Clone, Debug)]
pub struct PrinterPath<'a>(Cow<'a, BStr>); pub struct PrinterPath<'a>(Cow<'a, [u8]>);
impl<'a> PrinterPath<'a> { impl<'a> PrinterPath<'a> {
/// Create a new path suitable for printing. /// Create a new path suitable for printing.
pub fn new(path: &'a Path) -> PrinterPath<'a> { pub fn new(path: &'a Path) -> PrinterPath<'a> {
PrinterPath(BString::from_path_lossy(path)) PrinterPath(Vec::from_path_lossy(path))
} }
/// Create a new printer path from the given path which can be efficiently /// Create a new printer path from the given path which can be efficiently
@ -289,7 +289,7 @@ impl<'a> PrinterPath<'a> {
/// path separators that are both replaced by `new_sep`. In all other /// path separators that are both replaced by `new_sep`. In all other
/// environments, only `/` is treated as a path separator. /// environments, only `/` is treated as a path separator.
fn replace_separator(&mut self, new_sep: u8) { fn replace_separator(&mut self, new_sep: u8) {
let transformed_path: BString = self.0.bytes().map(|b| { let transformed_path: Vec<u8> = self.0.bytes().map(|b| {
if b == b'/' || (cfg!(windows) && b == b'\\') { if b == b'/' || (cfg!(windows) && b == b'\\') {
new_sep new_sep
} else { } else {
@ -301,7 +301,7 @@ impl<'a> PrinterPath<'a> {
/// Return the raw bytes for this path. /// Return the raw bytes for this path.
pub fn as_bytes(&self) -> &[u8] { pub fn as_bytes(&self) -> &[u8] {
self.0.as_bytes() &self.0
} }
} }

View File

@ -13,7 +13,7 @@ keywords = ["regex", "grep", "egrep", "search", "pattern"]
license = "Unlicense/MIT" license = "Unlicense/MIT"
[dependencies] [dependencies]
bstr = { version = "0.1.2", default-features = false, features = ["std"] } bstr = { version = "0.2.0", default-features = false, features = ["std"] }
bytecount = "0.5" bytecount = "0.5"
encoding_rs = "0.8.14" encoding_rs = "0.8.14"
encoding_rs_io = "0.1.6" encoding_rs_io = "0.1.6"

View File

@ -17,7 +17,7 @@ fn main() {
} }
} }
fn example() -> Result<(), Box<Error>> { fn example() -> Result<(), Box<dyn Error>> {
let pattern = match env::args().nth(1) { let pattern = match env::args().nth(1) {
Some(pattern) => pattern, Some(pattern) => pattern,
None => return Err(From::from(format!( None => return Err(From::from(format!(

View File

@ -1,7 +1,7 @@
use std::cmp; use std::cmp;
use std::io; use std::io;
use bstr::{BStr, BString}; use bstr::ByteSlice;
/// The default buffer capacity that we use for the line buffer. /// The default buffer capacity that we use for the line buffer.
pub(crate) const DEFAULT_BUFFER_CAPACITY: usize = 8 * (1<<10); // 8 KB pub(crate) const DEFAULT_BUFFER_CAPACITY: usize = 8 * (1<<10); // 8 KB
@ -122,7 +122,7 @@ impl LineBufferBuilder {
pub fn build(&self) -> LineBuffer { pub fn build(&self) -> LineBuffer {
LineBuffer { LineBuffer {
config: self.config, config: self.config,
buf: BString::from(vec![0; self.config.capacity]), buf: vec![0; self.config.capacity],
pos: 0, pos: 0,
last_lineterm: 0, last_lineterm: 0,
end: 0, end: 0,
@ -254,13 +254,14 @@ impl<'b, R: io::Read> LineBufferReader<'b, R> {
/// Return the contents of this buffer. /// Return the contents of this buffer.
pub fn buffer(&self) -> &[u8] { pub fn buffer(&self) -> &[u8] {
self.line_buffer.buffer().as_bytes() self.line_buffer.buffer()
} }
/// Return the underlying buffer as a byte string. Used for tests only. /// Return the buffer as a BStr, used for convenient equality checking
/// in tests only.
#[cfg(test)] #[cfg(test)]
fn bstr(&self) -> &BStr { fn bstr(&self) -> &::bstr::BStr {
self.line_buffer.buffer() self.buffer().as_bstr()
} }
/// Consume the number of bytes provided. This must be less than or equal /// Consume the number of bytes provided. This must be less than or equal
@ -289,7 +290,7 @@ pub struct LineBuffer {
/// The configuration of this buffer. /// The configuration of this buffer.
config: Config, config: Config,
/// The primary buffer with which to hold data. /// The primary buffer with which to hold data.
buf: BString, buf: Vec<u8>,
/// The current position of this buffer. This is always a valid sliceable /// The current position of this buffer. This is always a valid sliceable
/// index into `buf`, and its maximum value is the length of `buf`. /// index into `buf`, and its maximum value is the length of `buf`.
pos: usize, pos: usize,
@ -352,13 +353,13 @@ impl LineBuffer {
} }
/// Return the contents of this buffer. /// Return the contents of this buffer.
fn buffer(&self) -> &BStr { fn buffer(&self) -> &[u8] {
&self.buf[self.pos..self.last_lineterm] &self.buf[self.pos..self.last_lineterm]
} }
/// Return the contents of the free space beyond the end of the buffer as /// Return the contents of the free space beyond the end of the buffer as
/// a mutable slice. /// a mutable slice.
fn free_buffer(&mut self) -> &mut BStr { fn free_buffer(&mut self) -> &mut [u8] {
&mut self.buf[self.end..] &mut self.buf[self.end..]
} }
@ -481,7 +482,7 @@ impl LineBuffer {
} }
let roll_len = self.end - self.pos; let roll_len = self.end - self.pos;
self.buf.copy_within(self.pos.., 0); self.buf.copy_within_str(self.pos.., 0);
self.pos = 0; self.pos = 0;
self.last_lineterm = roll_len; self.last_lineterm = roll_len;
self.end = roll_len; self.end = roll_len;
@ -519,7 +520,7 @@ impl LineBuffer {
/// Replaces `src` with `replacement` in bytes, and return the offset of the /// Replaces `src` with `replacement` in bytes, and return the offset of the
/// first replacement, if one exists. /// first replacement, if one exists.
fn replace_bytes(bytes: &mut BStr, src: u8, replacement: u8) -> Option<usize> { fn replace_bytes(bytes: &mut [u8], src: u8, replacement: u8) -> Option<usize> {
if src == replacement { if src == replacement {
return None; return None;
} }
@ -542,7 +543,7 @@ fn replace_bytes(bytes: &mut BStr, src: u8, replacement: u8) -> Option<usize> {
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use std::str; use std::str;
use bstr::BString; use bstr::{ByteSlice, ByteVec};
use super::*; use super::*;
const SHERLOCK: &'static str = "\ const SHERLOCK: &'static str = "\
@ -563,7 +564,7 @@ and exhibited clearly, with a label attached.\
src: u8, src: u8,
replacement: u8, replacement: u8,
) -> (String, Option<usize>) { ) -> (String, Option<usize>) {
let mut dst = BString::from(slice); let mut dst = Vec::from(slice);
let result = replace_bytes(&mut dst, src, replacement); let result = replace_bytes(&mut dst, src, replacement);
(dst.into_string().unwrap(), result) (dst.into_string().unwrap(), result)
} }
@ -677,12 +678,12 @@ and exhibited clearly, with a label attached.\
let mut linebuf = LineBufferBuilder::new().capacity(1).build(); let mut linebuf = LineBufferBuilder::new().capacity(1).build();
let mut rdr = LineBufferReader::new(bytes.as_bytes(), &mut linebuf); let mut rdr = LineBufferReader::new(bytes.as_bytes(), &mut linebuf);
let mut got = BString::new(); let mut got = vec![];
while rdr.fill().unwrap() { while rdr.fill().unwrap() {
got.push(rdr.buffer()); got.push_str(rdr.buffer());
rdr.consume_all(); rdr.consume_all();
} }
assert_eq!(bytes, got); assert_eq!(bytes, got.as_bstr());
assert_eq!(rdr.absolute_byte_offset(), bytes.len() as u64); assert_eq!(rdr.absolute_byte_offset(), bytes.len() as u64);
assert_eq!(rdr.binary_byte_offset(), None); assert_eq!(rdr.binary_byte_offset(), None);
} }

View File

@ -2,7 +2,7 @@
A collection of routines for performing operations on lines. A collection of routines for performing operations on lines.
*/ */
use bstr::B; use bstr::ByteSlice;
use bytecount; use bytecount;
use grep_matcher::{LineTerminator, Match}; use grep_matcher::{LineTerminator, Match};
@ -85,7 +85,7 @@ impl LineStep {
#[inline(always)] #[inline(always)]
fn next_impl(&mut self, mut bytes: &[u8]) -> Option<(usize, usize)> { fn next_impl(&mut self, mut bytes: &[u8]) -> Option<(usize, usize)> {
bytes = &bytes[..self.end]; bytes = &bytes[..self.end];
match B(&bytes[self.pos..]).find_byte(self.line_term) { match bytes[self.pos..].find_byte(self.line_term) {
None => { None => {
if self.pos < bytes.len() { if self.pos < bytes.len() {
let m = (self.pos, bytes.len()); let m = (self.pos, bytes.len());
@ -135,14 +135,14 @@ pub fn locate(
line_term: u8, line_term: u8,
range: Match, range: Match,
) -> Match { ) -> Match {
let line_start = B(&bytes[..range.start()]) let line_start = bytes[..range.start()]
.rfind_byte(line_term) .rfind_byte(line_term)
.map_or(0, |i| i + 1); .map_or(0, |i| i + 1);
let line_end = let line_end =
if range.end() > line_start && bytes[range.end() - 1] == line_term { if range.end() > line_start && bytes[range.end() - 1] == line_term {
range.end() range.end()
} else { } else {
B(&bytes[range.end()..]) bytes[range.end()..]
.find_byte(line_term) .find_byte(line_term)
.map_or(bytes.len(), |i| range.end() + i + 1) .map_or(bytes.len(), |i| range.end() + i + 1)
}; };
@ -182,7 +182,7 @@ fn preceding_by_pos(
pos -= 1; pos -= 1;
} }
loop { loop {
match B(&bytes[..pos]).rfind_byte(line_term) { match bytes[..pos].rfind_byte(line_term) {
None => { None => {
return 0; return 0;
} }

View File

@ -1,6 +1,6 @@
use std::cmp; use std::cmp;
use bstr::B; use bstr::ByteSlice;
use grep_matcher::{LineMatchKind, Matcher}; use grep_matcher::{LineMatchKind, Matcher};
use lines::{self, LineStep}; use lines::{self, LineStep};
@ -161,7 +161,7 @@ impl<'s, M: Matcher, S: Sink> Core<'s, M, S> {
BinaryDetection::Convert(b) => b, BinaryDetection::Convert(b) => b,
_ => return Ok(false), _ => return Ok(false),
}; };
if let Some(i) = B(&buf[*range]).find_byte(binary_byte) { if let Some(i) = buf[*range].find_byte(binary_byte) {
let offset = range.start() + i; let offset = range.start() + i;
self.binary_byte_offset = Some(offset); self.binary_byte_offset = Some(offset);
if !self.binary_data(offset as u64)? { if !self.binary_data(offset as u64)? {

View File

@ -1,7 +1,7 @@
use std::io::{self, Write}; use std::io::{self, Write};
use std::str; use std::str;
use bstr::B; use bstr::ByteSlice;
use grep_matcher::{ use grep_matcher::{
LineMatchKind, LineTerminator, Match, Matcher, NoCaptures, NoError, LineMatchKind, LineTerminator, Match, Matcher, NoCaptures, NoError,
}; };
@ -94,7 +94,7 @@ impl Matcher for RegexMatcher {
} }
// Make it interesting and return the last byte in the current // Make it interesting and return the last byte in the current
// line. // line.
let i = B(haystack) let i = haystack
.find_byte(self.line_term.unwrap().as_byte()) .find_byte(self.line_term.unwrap().as_byte())
.map(|i| i) .map(|i| i)
.unwrap_or(haystack.len() - 1); .unwrap_or(haystack.len() - 1);

View File

@ -21,7 +21,7 @@ fn main() {
} }
} }
fn try_main() -> Result<(), Box<Error>> { fn try_main() -> Result<(), Box<dyn Error>> {
let mut args: Vec<OsString> = env::args_os().collect(); let mut args: Vec<OsString> = env::args_os().collect();
if args.len() < 2 { if args.len() < 2 {
return Err("Usage: simplegrep <pattern> [<path> ...]".into()); return Err("Usage: simplegrep <pattern> [<path> ...]".into());
@ -32,7 +32,7 @@ fn try_main() -> Result<(), Box<Error>> {
search(cli::pattern_from_os(&args[1])?, &args[2..]) search(cli::pattern_from_os(&args[1])?, &args[2..])
} }
fn search(pattern: &str, paths: &[OsString]) -> Result<(), Box<Error>> { fn search(pattern: &str, paths: &[OsString]) -> Result<(), Box<dyn Error>> {
let matcher = RegexMatcher::new_line_matcher(&pattern)?; let matcher = RegexMatcher::new_line_matcher(&pattern)?;
let mut searcher = SearcherBuilder::new() let mut searcher = SearcherBuilder::new()
.binary_detection(BinaryDetection::quit(b'\x00')) .binary_detection(BinaryDetection::quit(b'\x00'))

View File

@ -9,7 +9,7 @@ use std::io;
use std::ffi::OsString; use std::ffi::OsString;
use std::path::{Path, PathBuf}; use std::path::{Path, PathBuf};
use bstr::io::BufReadExt; use bstr::{io::BufReadExt, ByteSlice};
use log; use log;
use crate::Result; use crate::Result;