blob: 1d9e57be21924ca2a4ebaf3f833f3e3194f271e4 [file] [log] [blame] [raw]
#[macro_use] extern crate lazy_static;
extern crate rustc_demangle;
extern crate regex;
use std::io;
use std::io::prelude::*;
use regex::Regex;
use regex::Captures;
use rustc_demangle::demangle;
fn demangle_line(line: &str) -> String {
lazy_static! {
static ref RE: Regex = Regex::new(r"[_a-zA-Z$][_a-zA-Z$0-9.]*").unwrap();
}
RE.replace_all(line, |caps: &Captures| {
format!("{:#}", demangle(caps.get(0).unwrap().as_str()))
}).to_string()
}
#[cfg(test)]
mod tests {
#[test]
fn passes_text() {
assert_eq!(
::demangle_line("mo fo\tboom hello "),
"mo fo\tboom hello ");
}
#[test]
fn demangles() {
assert_eq!(
::demangle_line("_ZN7example4main17h0db00b8b32acffd5E:"),
"example::main:");
}
#[test]
fn handles_mid_demangling() {
assert_eq!(
::demangle_line(" lea rax, [rip + _ZN55_$LT$$RF$$u27$a$u20$T$u20$as$u20$core..fmt..Display$GT$3fmt17h510ed05e72307174E]"),
" lea rax, [rip + <&\'a T as core::fmt::Display>::fmt]");
}
#[test]
fn handles_call_plt() {
assert_eq!(
::demangle_line(" call _ZN3std2io5stdio6_print17he48522be5b0a80d9E@PLT"),
" call std::io::stdio::_print@PLT");
}
}
fn main() {
let stdin = io::stdin();
for line in stdin.lock().lines() {
println!("{}", demangle_line(&line.unwrap()));
}
}