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