while (true)
{
- if (*p == '\0')
- {
- *pp = p;
- return this->make_eof_token(p);
- }
-
// Skip whitespace quickly.
while (*p == ' ' || *p == '\t' || *p == '\r')
++p;
continue;
}
+ char c0 = *p;
+
+ if (c0 == '\0')
+ {
+ *pp = p;
+ return this->make_eof_token(p);
+ }
+
+ char c1 = p[1];
+
// Skip C style comments.
- if (p[0] == '/' && p[1] == '*')
+ if (c0 == '/' && c1 == '*')
{
int lineno = this->lineno_;
int charpos = p - this->linestart_ + 1;
}
// Skip line comments.
- if (*p == '#')
+ if (c0 == '#')
{
*pp = p + 1;
if (!this->skip_line_comment(pp))
}
// Check for a name.
- if (this->can_start_name(p[0], p[1]))
+ if (this->can_start_name(c0, c1))
return this->gather_token(Token::TOKEN_STRING,
&Lex::can_continue_name,
p, p + 1, pp);
return this->gather_quoted_string(pp);
}
+ // Be careful not to lookahead past the end of the buffer.
+ char c2 = (c1 == '\0' ? '\0' : p[2]);
+
// Check for a number.
- if (this->can_start_hex(p[0], p[1], p[2]))
+ if (this->can_start_hex(c0, c1, c2))
return this->gather_token(Token::TOKEN_INTEGER,
&Lex::can_continue_hex,
p, p + 3, pp);
- if (Lex::can_start_number(p[0]))
+ if (Lex::can_start_number(c0))
return this->gather_token(Token::TOKEN_INTEGER,
&Lex::can_continue_number,
p, p + 1, pp);
// Check for operators.
- int opcode = Lex::three_char_operator(p[0], p[1], p[2]);
+ int opcode = Lex::three_char_operator(c0, c1, c2);
if (opcode != 0)
{
*pp = p + 3;
return this->make_token(opcode, p);
}
- opcode = Lex::two_char_operator(p[0], p[1]);
+ opcode = Lex::two_char_operator(c0, c1);
if (opcode != 0)
{
*pp = p + 2;
return this->make_token(opcode, p);
}
- opcode = Lex::one_char_operator(p[0]);
+ opcode = Lex::one_char_operator(c0);
if (opcode != 0)
{
*pp = p + 1;