]> gitweb.factorcode.org Git - factor.git/blob - extra/alien/cxx/demangle/libstdcxx/libstdcxx.factor
factor: trim using lists
[factor.git] / extra / alien / cxx / demangle / libstdcxx / libstdcxx.factor
1 ! Copyright (C) 2010 Joe Groff.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien.c-types alien.data alien.destructors alien.strings
4 alien.syntax combinators destructors io.encodings.ascii kernel
5 libc sequences ;
6 IN: alien.cxx.demangle.libstdcxx
7
8 FUNCTION: char* __cxa_demangle ( char* mangled_name, char* output_buffer, size_t* length, int* status )
9
10 ERROR: demangle-memory-allocation-failure ;
11 ERROR: invalid-mangled-name name ;
12 ERROR: invalid-demangle-args name ;
13
14 : demangle-error ( name status -- )
15     {
16         {  0 [ drop ] }
17         { -1 [ drop demangle-memory-allocation-failure ] }
18         { -2 [ invalid-mangled-name ] }
19         { -3 [ invalid-demangle-args ] }
20     } case ;
21
22 : mangled-name? ( name -- ? )
23     "_Z" head? ;
24
25 DESTRUCTOR: (free)
26
27 :: demangle ( mangled-name -- c++-name )
28     0 ulong <ref> :> length
29     0 int <ref> :> status [
30         mangled-name ascii string>alien f length status __cxa_demangle &(free) :> demangled-buf
31         mangled-name status int deref demangle-error
32         demangled-buf ascii alien>string
33     ] with-destructors ;