new vocab alien.cxx.demangle.libstdcxx: name demangling for gnu abi
parent
f10ea3cbea
commit
dcf68af105
|
@ -0,0 +1,39 @@
|
||||||
|
! (c)2010 Joe Groff bsd license
|
||||||
|
USING: alien alien.c-types alien.libraries alien.strings
|
||||||
|
alien.syntax combinators destructors io.encodings.ascii kernel
|
||||||
|
libc locals sequences system ;
|
||||||
|
IN: alien.cxx.demangle.libstdcxx
|
||||||
|
|
||||||
|
<<
|
||||||
|
"libstdc++" {
|
||||||
|
{ [ os macosx? ] [ "/usr/lib/libstdc++.6.0.9.dylib" ] }
|
||||||
|
{ [ os unix? ] [ "/usr/lib/libstdc++.so" ] }
|
||||||
|
} cond cdecl add-library
|
||||||
|
>>
|
||||||
|
|
||||||
|
LIBRARY: libstdc++
|
||||||
|
|
||||||
|
FUNCTION: char* __cxa_demangle ( char* mangled_name, char* output_buffer, size_t* length, int* status ) ;
|
||||||
|
|
||||||
|
ERROR: demangle-memory-allocation-failure ;
|
||||||
|
ERROR: invalid-mangled-name name ;
|
||||||
|
ERROR: invalid-demangle-args name ;
|
||||||
|
|
||||||
|
: demangle-error ( name status -- )
|
||||||
|
{
|
||||||
|
{ 0 [ drop ] }
|
||||||
|
{ -1 [ drop demangle-memory-allocation-failure ] }
|
||||||
|
{ -2 [ invalid-mangled-name ] }
|
||||||
|
{ -3 [ invalid-demangle-args ] }
|
||||||
|
} case ;
|
||||||
|
|
||||||
|
: mangled-name? ( name -- ? )
|
||||||
|
"_Z" head? ;
|
||||||
|
|
||||||
|
:: demangle ( mangled-name -- c++-name )
|
||||||
|
0 <ulong> :> length
|
||||||
|
0 <int> :> status [
|
||||||
|
mangled-name ascii string>alien f length status __cxa_demangle &(free) :> demangled-buf
|
||||||
|
mangled-name status *int demangle-error
|
||||||
|
demangled-buf ascii alien>string
|
||||||
|
] with-destructors ;
|
Loading…
Reference in New Issue