summaryrefslogtreecommitdiffstats
path: root/grep-printer
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 23:24:08 -0400
commitc52da74ac30aa73a28cf64b9a4d2cdc63c42394a (patch)
treef61c34ff66d089fb43af8489dd6b730dbb2ea256 /grep-printer
parent7dcbff9a9b3e598d4be136d3261d4afecc729d6e (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.
Diffstat (limited to 'grep-printer')
-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()
}
}