feat(users/edef/refscan): high-performance Nix reference scanner
Research-grade code, treat with care. Change-Id: I99804df93e64101ef24928238ef0a8a02b59c2aa Reviewed-on: https://cl.tvl.fyi/c/depot/+/7686 Reviewed-by: edef <edef@edef.eu> Tested-by: BuildkiteCI
This commit is contained in:
parent
681800b438
commit
0b3c0725a2
7 changed files with 154 additions and 0 deletions
55
users/edef/refscan/src/main.rs
Normal file
55
users/edef/refscan/src/main.rs
Normal file
|
|
@ -0,0 +1,55 @@
|
|||
use std::{
|
||||
collections::BTreeSet as Set,
|
||||
convert::TryInto,
|
||||
io::{self, Read},
|
||||
str,
|
||||
};
|
||||
|
||||
fn main() {
|
||||
let max_refs: Set<[u8; 32]> = include_str!("../testdata/maxrefs")
|
||||
.lines()
|
||||
.map(|l| l.as_bytes().try_into().unwrap())
|
||||
.collect();
|
||||
|
||||
let input = {
|
||||
let stdin = io::stdin();
|
||||
let mut buffer = Vec::new();
|
||||
stdin.lock().read_to_end(&mut buffer).unwrap();
|
||||
buffer
|
||||
};
|
||||
|
||||
let base = input.as_ptr() as usize;
|
||||
let mut input: &[u8] = &input;
|
||||
while input.len() >= 32 {
|
||||
match refscan::scan_clean(&input) {
|
||||
Ok(buffer) | Err(buffer) => {
|
||||
let n = buffer.len();
|
||||
input = &input[n..];
|
||||
}
|
||||
}
|
||||
|
||||
let buffer = {
|
||||
let idx = input.iter().position(|x| match x {
|
||||
b'a'..=b'z' | b'0'..=b'9' => false,
|
||||
_ => true,
|
||||
});
|
||||
idx.map(|idx| &input[..idx]).unwrap_or(input)
|
||||
};
|
||||
|
||||
for chunk in buffer.windows(32) {
|
||||
let offset = (chunk.as_ptr() as usize) - base;
|
||||
let chunk = {
|
||||
let mut fixed = [0u8; 32];
|
||||
fixed.copy_from_slice(chunk);
|
||||
fixed
|
||||
};
|
||||
if max_refs.contains(&chunk) {
|
||||
let seen = unsafe { str::from_utf8_unchecked(&chunk) };
|
||||
println!("{} {}", seen, offset);
|
||||
}
|
||||
}
|
||||
|
||||
let n = buffer.len();
|
||||
input = &input[n..];
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue