tooling quality and some random rant
Michel Fortin
michel.fortin at michelf.com
Sun Feb 13 12:27:33 PST 2011
On 2011-02-13 14:38:20 -0500, Walter Bright <newshound2 at digitalmars.com> said:
> Denis Koroskin wrote:
>>> It's not impossible, but is a tremendous amount of work in order to
>>> improve one error message, and one error message that generations of C
>>> and C++ programmers are comfortable dealing with.
>>
>> What's wrong with parsing low-level linker error messages and output
>> them in human-readable form? E.g. demangle missing symbols.
>
> Yes, that can be done. The downside is since dmd does not control what
> linker the user has, it becomes a constant source of problems trying to
> keep it working as it constantly breaks with linker changes and an
> arbitrarily long list of linkers on various distributions.
Parsing error messages is a problem indeed. But demangling symbol names
is easy. Try this:
dmd ... 2>&1 | ddemangle
With ddemangle being a compiled version of this program:
import std.stdio;
import core.demangle;
void main()
{
foreach (line; stdin.byLine())
{
size_t beginIdx, endIdx;
enum State { searching_, searchingD, searchingEnd, done }
State state;
foreach (i, char c; line)
{
switch (state)
{
case State.searching_:
if (c == '_')
{
beginIdx = i;
state = State.searchingD;
}
break;
case State.searchingD:
if (c == 'D')
state = State.searchingEnd;
else if (c != '_')
state = State.searching_;
break;
case State.searchingEnd:
if (c == ' ' || c == '"' || c == '\'')
{
endIdx = i;
state = State.done;
}
break;
}
if (state == State.done)
break;
}
if (endIdx > beginIdx)
writeln(line[0..beginIdx], demangle(line[beginIdx..endIdx]),
line[endIdx..$]);
else
writeln(line);
}
}
--
Michel Fortin
michel.fortin at michelf.com
http://michelf.com/
More information about the Digitalmars-d
mailing list