Path: blob/main/crates/wizer/benches/uap-bench/src/lib.rs
3092 views
use regex::RegexSet;1use serde::Deserialize;2use std::sync::LazyLock;34static UA_REGEX_SET: LazyLock<RegexSet> = LazyLock::new(|| {5let uap_yaml = include_str!(concat!(env!("OUT_DIR"), "/regexes.yaml"));6let parsers: UserAgentParsers = serde_yaml::from_str(uap_yaml).unwrap();7RegexSet::new(8parsers9.user_agent_parsers10.iter()11.map(|e| e.regex.replace("\\/", "/").replace("\\!", "!")),12)13.unwrap()14});1516#[derive(Deserialize)]17struct UserAgentParsers {18user_agent_parsers: Vec<UserAgentParserEntry>,19}2021#[derive(Deserialize)]22struct UserAgentParserEntry {23regex: String,24// family_replacement: Option<String>,25// brand_replacement: Option<String>,26// model_replacement: Option<String>,27// os_replacement: Option<String>,28// v1_replacement: Option<String>,29// v2_replacement: Option<String>,30// os_v1_replacement: Option<String>,31// os_v2_replacement: Option<String>,32// os_v3_replacement: Option<String>,33}3435#[unsafe(export_name = "wizer-initialize")]36pub extern "C" fn init() {37LazyLock::force(&UA_REGEX_SET);38}3940#[unsafe(export_name = "run")]41pub extern "C" fn run(ptr: *mut u8, len: usize) -> i32 {42let s = unsafe {43let slice = std::slice::from_raw_parts(ptr, len);44std::str::from_utf8(slice).unwrap()45};46UA_REGEX_SET.is_match(&s) as u8 as i3247}4849#[unsafe(export_name = "alloc")]50pub extern "C" fn alloc(size: usize, align: usize) -> *mut u8 {51let layout = std::alloc::Layout::from_size_align(size, align).unwrap();52unsafe { std::alloc::alloc(layout) }53}5455#[unsafe(export_name = "dealloc")]56pub extern "C" fn dealloc(ptr: *mut u8, size: usize, align: usize) {57let layout = std::alloc::Layout::from_size_align(size, align).unwrap();58unsafe {59std::alloc::dealloc(ptr, layout);60}61}626364