#![allow(non_upper_case_globals)]
#![allow(non_camel_case_types)]
#![allow(non_snake_case)]
#![allow(improper_ctypes)]
use bytemuck::{Pod, Zeroable};
use cpp_demangle::Symbol;
use std::ffi::CStr;
use std::os::raw::{c_char, c_int};
include!("bindings.rs");
unsafe impl Pod for r_debug {}
unsafe impl Zeroable for r_debug {}
unsafe impl Pod for link_map {}
unsafe impl Zeroable for link_map {}
pub fn demangle(name: &str) -> Option<String> {
let sym = Symbol::new(name);
if let Ok(sym) = sym {
return Some(sym.to_string());
}
None
}
unsafe extern "C" {
fn sigabbrev_np(signum: c_int) -> *const c_char;
}
#[cfg(target_env = "gnu")] pub fn sig_abbrev(signum: i32) -> &'static str {
unsafe {
let ptr = sigabbrev_np(signum as c_int);
if ptr.is_null() {
return "";
}
CStr::from_ptr(ptr)
.to_str()
.expect("glibc never returns non-UTF-8")
}
}
#[test]
fn test_demangle() {
assert_eq!("std::cout", demangle("_ZSt4cout").unwrap());
}