mirror of
https://github.com/BurntSushi/ripgrep.git
synced 2025-05-19 09:40:22 -07:00
libripgrep is not any one library, but rather, a collection of libraries that roughly separate the following key distinct phases in a grep implementation: 1. Pattern matching (e.g., by a regex engine). 2. Searching a file using a pattern matcher. 3. Printing results. Ultimately, both (1) and (3) are defined by de-coupled interfaces, of which there may be multiple implementations. Namely, (1) is satisfied by the `Matcher` trait in the `grep-matcher` crate and (3) is satisfied by the `Sink` trait in the `grep2` crate. The searcher (2) ties everything together and finds results using a matcher and reports those results using a `Sink` implementation. Closes #162
30 lines
806 B
Rust
30 lines
806 B
Rust
/// Converts an arbitrary sequence of bytes to a literal suitable for building
|
|
/// a regular expression.
|
|
pub fn bytes_to_regex(bs: &[u8]) -> String {
|
|
use std::fmt::Write;
|
|
use regex_syntax::is_meta_character;
|
|
|
|
let mut s = String::with_capacity(bs.len());
|
|
for &b in bs {
|
|
if b <= 0x7F && !is_meta_character(b as char) {
|
|
write!(s, r"{}", b as char).unwrap();
|
|
} else {
|
|
write!(s, r"\x{:02x}", b).unwrap();
|
|
}
|
|
}
|
|
s
|
|
}
|
|
|
|
/// Converts arbitrary bytes to a nice string.
|
|
pub fn show_bytes(bs: &[u8]) -> String {
|
|
use std::ascii::escape_default;
|
|
use std::str;
|
|
|
|
let mut nice = String::new();
|
|
for &b in bs {
|
|
let part: Vec<u8> = escape_default(b).collect();
|
|
nice.push_str(str::from_utf8(&part).unwrap());
|
|
}
|
|
nice
|
|
}
|