]> gitweb.factorcode.org Git - factor.git/blob - extra/alien/cxx/demangle/libstdcxx/libstdcxx.factor
new vocab alien.cxx.demangle.libstdcxx: name demangling for gnu abi
[factor.git] / extra / alien / cxx / demangle / libstdcxx / libstdcxx.factor
1 ! (c)2010 Joe Groff bsd license
2 USING: alien alien.c-types alien.libraries alien.strings
3 alien.syntax combinators destructors io.encodings.ascii kernel
4 libc locals sequences system ;
5 IN: alien.cxx.demangle.libstdcxx
6
7 <<
8 "libstdc++" {
9     { [ os macosx? ] [ "/usr/lib/libstdc++.6.0.9.dylib" ] }
10     { [ os unix? ] [ "/usr/lib/libstdc++.so" ] }
11 } cond cdecl add-library
12 >>
13
14 LIBRARY: libstdc++
15
16 FUNCTION: char* __cxa_demangle ( char* mangled_name, char* output_buffer, size_t* length, int* status ) ;
17
18 ERROR: demangle-memory-allocation-failure ;
19 ERROR: invalid-mangled-name name ;
20 ERROR: invalid-demangle-args name ;
21
22 : demangle-error ( name status -- )
23     {
24         {  0 [ drop ] }
25         { -1 [ drop demangle-memory-allocation-failure ] }
26         { -2 [ invalid-mangled-name ] }
27         { -3 [ invalid-demangle-args ] }
28     } case ;
29
30 : mangled-name? ( name -- ? )
31     "_Z" head? ;
32
33 :: demangle ( mangled-name -- c++-name )
34     0 <ulong> :> length
35     0 <int> :> status [
36         mangled-name ascii string>alien f length status __cxa_demangle &(free) :> demangled-buf
37         mangled-name status *int demangle-error
38         demangled-buf ascii alien>string
39     ] with-destructors ;