|  | // 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); | 
|  | } |