On 2011-02-13 14:38:20 -0500, Walter Bright <newshou...@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.for...@michelf.com
http://michelf.com/

Reply via email to