# HG changeset patch # User aziz # Date 1182966601 0 # Node ID 1786c28254910819466da9a7bde41f45be4d9136 # Parent f65a83c276388e2e204a6f16ee709644d6f66d95 - Fixed scanner for hex string literals. Terminating string with 0. Relocated some code to the bottom. diff -r f65a83c27638 -r 1786c2825491 trunk/src/Lexer.d --- a/trunk/src/Lexer.d Wed Jun 27 17:18:02 2007 +0000 +++ b/trunk/src/Lexer.d Wed Jun 27 17:50:01 2007 +0000 @@ -874,45 +874,35 @@ void scanHexStringLiteral(ref Token t) { assert(p[0] == 'x' && p[1] == '"'); - p+=2; t.type = TOK.String; uint c; ubyte[] buffer; ubyte h; // hex number uint n; // number of hex digits - MID mid; + ++p; while (1) { - c = *p++; + c = *++p; switch (c) { case '"': + ++p; if (n & 1) - { - mid = MID.OddNumberOfDigitsInHexString; - error(mid); - } + error(MID.OddNumberOfDigitsInHexString); + t.pf = scanPostfix(); + Lreturn: + buffer ~= 0; t.str = cast(string) buffer; - t.pf = scanPostfix(); t.end = p; return; case '\r': - if (*p == '\n') + if (p[1] == '\n') ++p; case '\n': ++loc; continue; - case LS[0]: - if (*p == LS[1] && (p[1] == LS[2] || p[1] == PS[2])) { - p += 2; - ++loc; - } - continue; - case 0, _Z_: - mid = MID.UnterminatedHexString; - goto Lerr; default: if (ishexad(c)) { @@ -936,16 +926,22 @@ } else if (isspace(c)) continue; - mid = MID.NonHexCharInHexString; - goto Lerr; + else if (c == LS[0] && p[1] == LS[1] && (p[2] == LS[2] || p[2] == PS[2])) + { + ++p; ++p; + ++loc; + continue; + } + else if (c == 0 || c == _Z_) + { + error(MID.UnterminatedHexString); + t.pf = 0; + goto Lreturn; + } + error(MID.NonHexCharInHexString); } } - - return; - Lerr: - error(mid); - t.pf = 0; - t.end = p; + assert(0); } dchar scanEscapeSequence()