summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRan Benita <ran234@gmail.com>2013-03-14 12:45:34 +0200
committerDaniel Stone <daniel@fooishbar.org>2013-03-18 22:20:06 +0000
commit0513686b5d1ea14b3b8340371b2174ce152732c8 (patch)
treed360a18c97d6d4da3016dd1ccd4f07f56808f84a /src
parent0e200bd507eae13298604c129cc91aed2e947420 (diff)
rules: be more paranoid in scanner
This can't happen, but better safe than sorry. The optimizations were noticeable but negligible. Signed-off-by: Ran Benita <ran234@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/xkbcomp/rules.c25
1 files changed, 9 insertions, 16 deletions
diff --git a/src/xkbcomp/rules.c b/src/xkbcomp/rules.c
index 348ecc9..3f71760 100644
--- a/src/xkbcomp/rules.c
+++ b/src/xkbcomp/rules.c
@@ -213,35 +213,26 @@ scanner_init(struct scanner *s, struct xkb_context *ctx,
static char
peek(struct scanner *s)
{
- return s->s[s->pos];
+ return s->pos < s->len ? s->s[s->pos] : '\0';
}
static bool
eof(struct scanner *s)
{
- return s->s[s->pos] == '\0' || s->pos >= s->len;
+ return peek(s) == '\0';
}
static bool
eol(struct scanner *s)
{
- return s->s[s->pos] == '\n';
+ return peek(s) == '\n';
}
-/*
- * Use the check_nl variant when the current char might be a new line;
- * just an optimization.
- */
static char
next(struct scanner *s)
{
- s->column++;
- return s->s[s->pos++];
-}
-
-static char
-next_check_nl(struct scanner *s)
-{
+ if (eof(s))
+ return '\0';
if (eol(s)) {
s->line++;
s->column = 1;
@@ -264,6 +255,8 @@ chr(struct scanner *s, char ch)
static bool
str(struct scanner *s, const char *string, size_t len)
{
+ if (s->len - s->pos < len)
+ return false;
if (strncasecmp(s->s + s->pos, string, len) != 0)
return false;
s->pos += len; s->column += len;
@@ -286,7 +279,7 @@ skip_more_whitespace_and_comments:
/* New line. */
if (eol(s)) {
- while (eol(s)) next_check_nl(s);
+ while (eol(s)) next(s);
return TOK_END_OF_LINE;
}
@@ -297,7 +290,7 @@ skip_more_whitespace_and_comments:
"illegal new line escape; must appear at end of line");
return TOK_ERROR;
}
- next_check_nl(s);
+ next(s);
goto skip_more_whitespace_and_comments;
}