| #[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())); |
| } |
| } |