xref: /netbsd-src/external/gpl3/gcc.old/dist/libphobos/src/std/demangle.d (revision 627f7eb200a4419d89b531d55fccd2ee3ffdcde0)
1*627f7eb2Smrg // Written in the D programming language.
2*627f7eb2Smrg 
3*627f7eb2Smrg /**
4*627f7eb2Smrg  * Demangle D mangled names.
5*627f7eb2Smrg  *
6*627f7eb2Smrg  * Copyright: Copyright Digital Mars 2000 - 2009.
7*627f7eb2Smrg  * License:   $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0).
8*627f7eb2Smrg  * Authors:   $(HTTP digitalmars.com, Walter Bright),
9*627f7eb2Smrg  *                        Thomas K$(UUML)hne, Frits van Bommel
10*627f7eb2Smrg  * Source:    $(PHOBOSSRC std/_demangle.d)
11*627f7eb2Smrg  * $(SCRIPT inhibitQuickIndex = 1;)
12*627f7eb2Smrg  */
13*627f7eb2Smrg /*
14*627f7eb2Smrg  *          Copyright Digital Mars 2000 - 2009.
15*627f7eb2Smrg  * Distributed under the Boost Software License, Version 1.0.
16*627f7eb2Smrg  *    (See accompanying file LICENSE_1_0.txt or copy at
17*627f7eb2Smrg  *          http://www.boost.org/LICENSE_1_0.txt)
18*627f7eb2Smrg  */
19*627f7eb2Smrg module std.demangle;
20*627f7eb2Smrg 
21*627f7eb2Smrg /+
22*627f7eb2Smrg private class MangleException : Exception
23*627f7eb2Smrg {
24*627f7eb2Smrg     this()
25*627f7eb2Smrg     {
26*627f7eb2Smrg         super("MangleException");
27*627f7eb2Smrg     }
28*627f7eb2Smrg }
29*627f7eb2Smrg +/
30*627f7eb2Smrg 
31*627f7eb2Smrg /*****************************
32*627f7eb2Smrg  * Demangle D mangled names.
33*627f7eb2Smrg  *
34*627f7eb2Smrg  * If it is not a D mangled name, it returns its argument name.
35*627f7eb2Smrg  * Example:
36*627f7eb2Smrg  *        This program reads standard in and writes it to standard out,
37*627f7eb2Smrg  *        pretty-printing any found D mangled names.
38*627f7eb2Smrg -------------------
39*627f7eb2Smrg import core.stdc.stdio : stdin;
40*627f7eb2Smrg import std.stdio;
41*627f7eb2Smrg import std.ascii;
42*627f7eb2Smrg import std.demangle;
43*627f7eb2Smrg 
44*627f7eb2Smrg void test(int x, float y) { }
45*627f7eb2Smrg 
46*627f7eb2Smrg int main()
47*627f7eb2Smrg {
48*627f7eb2Smrg     string buffer;
49*627f7eb2Smrg     bool inword;
50*627f7eb2Smrg     int c;
51*627f7eb2Smrg 
52*627f7eb2Smrg     writefln("Try typing in: %s", test.mangleof);
53*627f7eb2Smrg     while ((c = fgetc(stdin)) != EOF)
54*627f7eb2Smrg     {
55*627f7eb2Smrg         if (inword)
56*627f7eb2Smrg         {
57*627f7eb2Smrg             if (c == '_' || isAlphaNum(c))
58*627f7eb2Smrg                 buffer ~= cast(char) c;
59*627f7eb2Smrg             else
60*627f7eb2Smrg             {
61*627f7eb2Smrg                 inword = false;
62*627f7eb2Smrg                 write(demangle(buffer), cast(char) c);
63*627f7eb2Smrg             }
64*627f7eb2Smrg         }
65*627f7eb2Smrg         else
66*627f7eb2Smrg         {   if (c == '_' || isAlpha(c))
67*627f7eb2Smrg             {
68*627f7eb2Smrg                 inword = true;
69*627f7eb2Smrg                 buffer.length = 0;
70*627f7eb2Smrg                 buffer ~= cast(char) c;
71*627f7eb2Smrg             }
72*627f7eb2Smrg             else
73*627f7eb2Smrg                 write(cast(char) c);
74*627f7eb2Smrg         }
75*627f7eb2Smrg     }
76*627f7eb2Smrg     if (inword)
77*627f7eb2Smrg         write(demangle(buffer));
78*627f7eb2Smrg     return 0;
79*627f7eb2Smrg }
80*627f7eb2Smrg -------------------
81*627f7eb2Smrg  */
82*627f7eb2Smrg 
demangle(string name)83*627f7eb2Smrg string demangle(string name)
84*627f7eb2Smrg {
85*627f7eb2Smrg     import core.demangle : demangle;
86*627f7eb2Smrg     import std.exception : assumeUnique;
87*627f7eb2Smrg     auto ret = demangle(name);
88*627f7eb2Smrg     return assumeUnique(ret);
89*627f7eb2Smrg }
90