Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/crates/wizer/benches/uap-bench/src/lib.rs
3092 views
1
use regex::RegexSet;
2
use serde::Deserialize;
3
use std::sync::LazyLock;
4
5
static UA_REGEX_SET: LazyLock<RegexSet> = LazyLock::new(|| {
6
let uap_yaml = include_str!(concat!(env!("OUT_DIR"), "/regexes.yaml"));
7
let parsers: UserAgentParsers = serde_yaml::from_str(uap_yaml).unwrap();
8
RegexSet::new(
9
parsers
10
.user_agent_parsers
11
.iter()
12
.map(|e| e.regex.replace("\\/", "/").replace("\\!", "!")),
13
)
14
.unwrap()
15
});
16
17
#[derive(Deserialize)]
18
struct UserAgentParsers {
19
user_agent_parsers: Vec<UserAgentParserEntry>,
20
}
21
22
#[derive(Deserialize)]
23
struct UserAgentParserEntry {
24
regex: String,
25
// family_replacement: Option<String>,
26
// brand_replacement: Option<String>,
27
// model_replacement: Option<String>,
28
// os_replacement: Option<String>,
29
// v1_replacement: Option<String>,
30
// v2_replacement: Option<String>,
31
// os_v1_replacement: Option<String>,
32
// os_v2_replacement: Option<String>,
33
// os_v3_replacement: Option<String>,
34
}
35
36
#[unsafe(export_name = "wizer-initialize")]
37
pub extern "C" fn init() {
38
LazyLock::force(&UA_REGEX_SET);
39
}
40
41
#[unsafe(export_name = "run")]
42
pub extern "C" fn run(ptr: *mut u8, len: usize) -> i32 {
43
let s = unsafe {
44
let slice = std::slice::from_raw_parts(ptr, len);
45
std::str::from_utf8(slice).unwrap()
46
};
47
UA_REGEX_SET.is_match(&s) as u8 as i32
48
}
49
50
#[unsafe(export_name = "alloc")]
51
pub extern "C" fn alloc(size: usize, align: usize) -> *mut u8 {
52
let layout = std::alloc::Layout::from_size_align(size, align).unwrap();
53
unsafe { std::alloc::alloc(layout) }
54
}
55
56
#[unsafe(export_name = "dealloc")]
57
pub extern "C" fn dealloc(ptr: *mut u8, size: usize, align: usize) {
58
let layout = std::alloc::Layout::from_size_align(size, align).unwrap();
59
unsafe {
60
std::alloc::dealloc(ptr, layout);
61
}
62
}
63
64