dexed/dexed-d/src/ddemangle.d

40 lines
952 B
D

module ddemangle;
import core.demangle : demangle;
import std.regex : replaceAll, Captures, regex, Regex;
import core.stdc.string : strlen;
import common : FpcArray;
extern(C):
export FpcArray!(const(char))* ddemangle(const(char)* line)
{
__gshared Regex!char reDemangle;
__gshared bool reInit;
if (!reInit)
{
reInit = true;
reDemangle = regex(r"\b_?_D[0-9a-zA-Z_]+\b");
}
return FpcArray!(const(char)).fromArray(
replaceAll!(demangleMatch)(line[0 .. line.strlen], reDemangle)
);
}
extern(D): private:
const(char)[] demangleMatch(Captures!(const(char)[]) m)
{
// If the second character is an underscore, it may be a D symbol with double leading underscore;
if (m.hit.length > 0 && m.hit[1] != '_')
{
return demangle(m.hit);
}
else
{
auto result = demangle(m.hit[1..$]);
return result == m.hit[1..$] ? m.hit : result;
}
}