Mercurial > projects > dil
changeset 53:1786c2825491
- Fixed scanner for hex string literals. Terminating string with 0. Relocated some code to the bottom.
author | aziz |
---|---|
date | Wed, 27 Jun 2007 17:50:01 +0000 |
parents | f65a83c27638 |
children | e55bd2270f94 |
files | trunk/src/Lexer.d |
diffstat | 1 files changed, 22 insertions(+), 26 deletions(-) [+] |
line wrap: on
line diff
--- 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()