mirror of
https://github.com/thunderbrewhq/binana.git
synced 2026-03-22 22:00:13 +00:00
49 lines
986 B
Go
49 lines
986 B
Go
package util
|
|
|
|
import (
|
|
"bytes"
|
|
"fmt"
|
|
"os/exec"
|
|
"strings"
|
|
)
|
|
|
|
var demangle_cache = make(map[string]string)
|
|
|
|
func demangle(str string) (demangled string, err error) {
|
|
var ok bool
|
|
if demangled, ok = demangle_cache[str]; ok {
|
|
return
|
|
}
|
|
|
|
var output bytes.Buffer
|
|
c := exec.Command("demumble", str)
|
|
c.Stdout = &output
|
|
c.Run()
|
|
if output.Len() == 0 {
|
|
err = fmt.Errorf("cannot demangle")
|
|
return
|
|
}
|
|
demangled = output.String()
|
|
demangled = strings.TrimSuffix(demangled, "\n")
|
|
if str == demangled {
|
|
err = fmt.Errorf("cannot demangle")
|
|
return
|
|
}
|
|
demangle_cache[str] = demangled
|
|
return
|
|
}
|
|
|
|
func looks_mangled(str string) bool {
|
|
if strings.HasPrefix(str, ".") {
|
|
return true
|
|
} else if strings.HasPrefix(str, "?") {
|
|
return true
|
|
} else if strings.HasPrefix(str, "_Z") {
|
|
return true
|
|
} else if len(str) > 0 && str[0] >= '0' && str[0] <= '9' {
|
|
return true
|
|
} else if strings.ContainsAny(str, "0123456789") && !strings.Contains(str, " ") {
|
|
return true
|
|
}
|
|
return false
|
|
}
|