summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndrew Gallant <jamslam@gmail.com>2019-04-03 21:27:35 -0400
committerAndrew Gallant <jamslam@gmail.com>2019-04-05 20:42:25 -0400
commit5e50a3c43c763851a6374e0e1750f0ee58ce4a1c (patch)
treef61c34ff66d089fb43af8489dd6b730dbb2ea256
parent85417e52e919ae601b0b7eec87349fadea2da650 (diff)
printer: use bstr
This starts the usage of bstr in the printer. We don't use it too much yet, but it comes in handy for implementing PrinterPath and lets us push down some platform specific code into bstr.
-rw-r--r--grep-printer/Cargo.toml1
-rw-r--r--grep-printer/src/lib.rs1
-rw-r--r--grep-printer/src/util.rs23
3 files changed, 7 insertions, 18 deletions
diff --git a/grep-printer/Cargo.toml b/grep-printer/Cargo.toml
index e0680052..1ce553fe 100644
--- a/grep-printer/Cargo.toml
+++ b/grep-printer/Cargo.toml
@@ -19,6 +19,7 @@ serde1 = ["base64", "serde", "serde_derive", "serde_json"]
[dependencies]
base64 = { version = "0.10.0", optional = true }
+bstr = "0.1.2"
grep-matcher = { version = "0.1.1", path = "../grep-matcher" }
grep-searcher = { version = "0.1.1", path = "../grep-searcher" }
termcolor = "1.0.4"
diff --git a/grep-printer/src/lib.rs b/grep-printer/src/lib.rs
index 6ef11c72..1e7d5c6e 100644
--- a/grep-printer/src/lib.rs
+++ b/grep-printer/src/lib.rs
@@ -70,6 +70,7 @@ fn example() -> Result<(), Box<Error>> {
#[cfg(feature = "serde1")]
extern crate base64;
+extern crate bstr;
extern crate grep_matcher;
#[cfg(test)]
extern crate grep_regex;
diff --git a/grep-printer/src/util.rs b/grep-printer/src/util.rs
index e2d80c7f..16d23685 100644
--- a/grep-printer/src/util.rs
+++ b/grep-printer/src/util.rs
@@ -4,6 +4,7 @@ use std::io;
use std::path::Path;
use std::time;
+use bstr::{BStr, BString};
use grep_matcher::{Captures, LineTerminator, Match, Matcher};
use grep_searcher::{
LineIter,
@@ -262,26 +263,12 @@ impl<'a> Sunk<'a> {
/// portability with a small cost: on Windows, paths that are not valid UTF-16
/// will not roundtrip correctly.
#[derive(Clone, Debug)]
-pub struct PrinterPath<'a>(Cow<'a, [u8]>);
+pub struct PrinterPath<'a>(Cow<'a, BStr>);
impl<'a> PrinterPath<'a> {
/// Create a new path suitable for printing.
pub fn new(path: &'a Path) -> PrinterPath<'a> {
- PrinterPath::new_impl(path)
- }
-
- #[cfg(unix)]
- fn new_impl(path: &'a Path) -> PrinterPath<'a> {
- use std::os::unix::ffi::OsStrExt;
- PrinterPath(Cow::Borrowed(path.as_os_str().as_bytes()))
- }
-
- #[cfg(not(unix))]
- fn new_impl(path: &'a Path) -> PrinterPath<'a> {
- PrinterPath(match path.to_string_lossy() {
- Cow::Owned(path) => Cow::Owned(path.into_bytes()),
- Cow::Borrowed(path) => Cow::Borrowed(path.as_bytes()),
- })
+ PrinterPath(BString::from_path_lossy(path))
}
/// Create a new printer path from the given path which can be efficiently
@@ -302,7 +289,7 @@ impl<'a> PrinterPath<'a> {
/// path separators that are both replaced by `new_sep`. In all other
/// environments, only `/` is treated as a path separator.
fn replace_separator(&mut self, new_sep: u8) {
- let transformed_path: Vec<_> = self.as_bytes().iter().map(|&b| {
+ let transformed_path: BString = self.0.bytes().map(|b| {
if b == b'/' || (cfg!(windows) && b == b'\\') {
new_sep
} else {
@@ -314,7 +301,7 @@ impl<'a> PrinterPath<'a> {
/// Return the raw bytes for this path.
pub fn as_bytes(&self) -> &[u8] {
- &*self.0
+ self.0.as_bytes()
}
}