// Written in the D programming language. /** * Demangle D mangled names. * * Copyright: Copyright The D Language Foundation 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 The D Language Foundation 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; /** Demangle D mangled names. Params: name = the mangled name Returns: A `string`. If it is not a D mangled name, it returns its argument name. */ string demangle(string name) @safe pure nothrow { import core.demangle : demangle; import std.exception : assumeUnique; auto ret = demangle(name); return () @trusted { return ret.assumeUnique; } (); } /// @safe pure unittest { // int b in module a assert(demangle("_D1a1bi") == "int a.b"); // char array foo in module test assert(demangle("_D4test3fooAa") == "char[] test.foo"); } /** This program reads standard in and writes it to standard out, pretty-printing any found D mangled names. */ @system unittest { import std.ascii : isAlphaNum; import std.algorithm.iteration : chunkBy, joiner, map; import std.algorithm.mutation : copy; import std.conv : to; import std.demangle : demangle; import std.functional : pipe; import std.stdio : stdin, stdout; void main() { stdin.byLineCopy .map!( l => l.chunkBy!(a => isAlphaNum(a) || a == '_') .map!(a => a[1].pipe!(to!string, demangle)).joiner ) .copy(stdout.lockingTextWriter); } }