| // Written in the D programming language. | |
| /** | |
| * Demangle D mangled names. | |
| * | |
| * Copyright: Copyright Digital Mars 2000 - 2009. | |
| * License: $(HTTP www.boost.org/LICENSE_1_0.txt, Boost License 1.0). | |
| * Authors: $(HTTP digitalmars.com, Walter Bright), | |
| * Thomas K$(UUML)hne, Frits van Bommel | |
| * Source: $(PHOBOSSRC std/_demangle.d) | |
| * $(SCRIPT inhibitQuickIndex = 1;) | |
| */ | |
| /* | |
| * Copyright Digital Mars 2000 - 2009. | |
| * Distributed under the Boost Software License, Version 1.0. | |
| * (See accompanying file LICENSE_1_0.txt or copy at | |
| * http://www.boost.org/LICENSE_1_0.txt) | |
| */ | |
| module std.demangle; | |
| /+ | |
| private class MangleException : Exception | |
| { | |
| this() | |
| { | |
| super("MangleException"); | |
| } | |
| } | |
| +/ | |
| /***************************** | |
| * Demangle D mangled names. | |
| * | |
| * If it is not a D mangled name, it returns its argument name. | |
| * Example: | |
| * This program reads standard in and writes it to standard out, | |
| * pretty-printing any found D mangled names. | |
| ------------------- | |
| import core.stdc.stdio : stdin; | |
| import std.stdio; | |
| import std.ascii; | |
| import std.demangle; | |
| void test(int x, float y) { } | |
| int main() | |
| { | |
| string buffer; | |
| bool inword; | |
| int c; | |
| writefln("Try typing in: %s", test.mangleof); | |
| while ((c = fgetc(stdin)) != EOF) | |
| { | |
| if (inword) | |
| { | |
| if (c == '_' || isAlphaNum(c)) | |
| buffer ~= cast(char) c; | |
| else | |
| { | |
| inword = false; | |
| write(demangle(buffer), cast(char) c); | |
| } | |
| } | |
| else | |
| { if (c == '_' || isAlpha(c)) | |
| { | |
| inword = true; | |
| buffer.length = 0; | |
| buffer ~= cast(char) c; | |
| } | |
| else | |
| write(cast(char) c); | |
| } | |
| } | |
| if (inword) | |
| write(demangle(buffer)); | |
| return 0; | |
| } | |
| ------------------- | |
| */ | |
| string demangle(string name) | |
| { | |
| import core.demangle : demangle; | |
| import std.exception : assumeUnique; | |
| auto ret = demangle(name); | |
| return assumeUnique(ret); | |
| } |