Files
unshell/ush-obfuscate/src/symbolic_ref/mod.rs
T

49 lines
1.1 KiB
Rust
Raw Normal View History

2026-02-20 18:17:11 -07:00
use std::collections::HashMap;
2026-02-20 18:17:11 -07:00
use base62::{Base62, hash};
use proc_macro::TokenStream;
use quote::quote;
use syn::{LitStr, parse_macro_input};
use crate::env::get_encryption_key;
static mut SYM_COUNTER: Vec<String> = Vec::new();
#[allow(static_mut_refs)]
pub fn get_symbol_number() -> usize {
unsafe { SYM_COUNTER.len() }
}
#[allow(static_mut_refs)]
pub fn get_symbol(text: String) -> usize {
unsafe {
if let Some(n) = SYM_COUNTER.iter().position(|r| r == &text) {
n
} else {
SYM_COUNTER.push(text);
SYM_COUNTER.len() - 1
}
}
}
pub fn sym_ref(input: TokenStream) -> TokenStream {
// Parse the input as a string literal
let lit_str = parse_macro_input!(input as LitStr);
let original_name = lit_str.value();
let n = get_symbol(original_name);
let data = base62::encode_usize(n);
let key = hash(&get_encryption_key().as_bytes());
let encoded = format!("_{}_", Base62::encode_full(&data, &key));
println!("Aliased '{}' as '{encoded}'", lit_str.value());
// Expand to a static string literal
TokenStream::from(quote! {
#encoded
})
}