diff options
Diffstat (limited to 'Build/source/utils/asymptote/util.cc')
-rw-r--r-- | Build/source/utils/asymptote/util.cc | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/Build/source/utils/asymptote/util.cc b/Build/source/utils/asymptote/util.cc index 33fb56ad104..46f99ab669d 100644 --- a/Build/source/utils/asymptote/util.cc +++ b/Build/source/utils/asymptote/util.cc @@ -17,7 +17,6 @@ #include <sys/stat.h> #include <fcntl.h> #include <unistd.h> -#include <signal.h> #include <cstring> #include <algorithm> @@ -35,6 +34,31 @@ namespace vm { void error(const char* message); } +#if __GNUC__ +#include <cxxabi.h> +string demangle(const char *s) +{ + int status; + char *demangled = abi::__cxa_demangle(s,NULL,NULL,&status); + if (status == 0 && demangled) { + string str(demangled); + free(demangled); + return str; + } else if (status == -2) { + free(demangled); + return s; + } else { + free(demangled); + return string("Unknown(") + s + ")"; + } +}; +#else +string demangle(const char* s) +{ + return s; +} +#endif + char *Strdup(string s) { size_t size=s.size()+1; @@ -162,6 +186,16 @@ string auxname(string filename, string suffix) return buildname(filename,suffix,"_"); } +sighandler_t Signal(int signum, sighandler_t handler) +{ + struct sigaction action,oldaction; + action.sa_handler=handler; + sigemptyset(&action.sa_mask); + action.sa_flags=0; + return sigaction(signum,&action,&oldaction) == 0 ? oldaction.sa_handler : + SIG_ERR; +} + void push_split(mem::vector<string>& a, const string& S) { const char *p=S.c_str(); |