On Thursday, 18 October 2012 at 11:26:13 UTC, monarch_dodra wrote:

NOT a final version.

With correct-er utf string support. In theory, non-ascii characters are illegal, but it makes for safer code, and better diagnosis.

//----
ubyte[] decode(string s)
{
    ubyte[] ret;;
    while(s.length)
    {
        while( s.front == ' ' || s.front == '_' )
        {
            s.popFront();
if (!s.length) assert(0, text("Premature end of string."));;
        }

        dchar c1 = s.front;
if (!std.ascii.isHexDigit(c1)) assert(0, text("Unexpected character ", c1, "."));
        c1 = std.ascii.toUpper(c1);

        s.popFront();
if (!s.length) assert(0, text("Premature end of string after ", c1, "."));

        dchar c2 = s.front;
if (!std.ascii.isHexDigit(c2)) assert(0, text("Unexpected character ", c2, " after ", c1, "."));
        c2 = std.ascii.toUpper(c2);
        s.popFront();

        ubyte val;
        if('0' <= c2 && c2 <= '9') val += (c2 - '0');
        if('A' <= c2 && c2 <= 'F') val += (c2 - 'A' + 10);
        if('0' <= c1 && c1 <= '9') val += ((c1 - '0')*16);
        if('A' <= c1 && c1 <= 'F') val += ((c1 - 'A' + 10)*16);
        ret ~= val;
    }
    return ret;
}
//----

Reply via email to