Permalink
90 lines (82 sloc) 2.04 KB
// 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);
}