X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fscanner-utils.h;h=3be839206704a1427660a58452c481fb750e0e28;hb=refs%2Fheads%2Faccepted%2Ftizen_unified_toolchain;hp=5fdb22ae9a64c223cb25890429e590f81424e683;hpb=f774f819d6d406bf859d22d447895b0bc256297a;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/src/scanner-utils.h b/src/scanner-utils.h index 5fdb22a..3be8392 100644 --- a/src/scanner-utils.h +++ b/src/scanner-utils.h @@ -49,23 +49,36 @@ struct scanner { size_t len; char buf[1024]; size_t buf_pos; - unsigned line, column; + size_t line, column; /* The line/column of the start of the current token. */ - unsigned token_line, token_column; + size_t token_line, token_column; const char *file_name; struct xkb_context *ctx; void *priv; }; +#define scanner_log_with_code(scanner, level, log_msg_id, fmt, ...) \ + xkb_log_with_code((scanner)->ctx, (level), 0, log_msg_id, \ + "%s:%zu:%zu: " fmt "\n", \ + (scanner)->file_name, \ + (scanner)->token_line, \ + (scanner)->token_column, ##__VA_ARGS__) + #define scanner_log(scanner, level, fmt, ...) \ xkb_log((scanner)->ctx, (level), 0, \ - "%s:%u:%u: " fmt "\n", \ - (scanner)->file_name, \ - (scanner)->token_line, (scanner)->token_column, ##__VA_ARGS__) + "%s:%zu:%zu: " fmt "\n", \ + (scanner)->file_name, \ + (scanner)->token_line, (scanner)->token_column, ##__VA_ARGS__) + +#define scanner_err_with_code(scanner, id, fmt, ...) \ + scanner_log_with_code(scanner, XKB_LOG_LEVEL_ERROR, id, fmt, ##__VA_ARGS__) #define scanner_err(scanner, fmt, ...) \ scanner_log(scanner, XKB_LOG_LEVEL_ERROR, fmt, ##__VA_ARGS__) +#define scanner_warn_with_code(scanner, id, fmt, ...) \ + scanner_log_with_code(scanner, XKB_LOG_LEVEL_WARNING, id, fmt, ##__VA_ARGS__) + #define scanner_warn(scanner, fmt, ...) \ scanner_log(scanner, XKB_LOG_LEVEL_WARNING, fmt, ##__VA_ARGS__) @@ -85,7 +98,7 @@ scanner_init(struct scanner *s, struct xkb_context *ctx, } static inline char -peek(struct scanner *s) +scanner_peek(struct scanner *s) { if (unlikely(s->pos >= s->len)) return '\0'; @@ -93,19 +106,19 @@ peek(struct scanner *s) } static inline bool -eof(struct scanner *s) +scanner_eof(struct scanner *s) { return s->pos >= s->len; } static inline bool -eol(struct scanner *s) +scanner_eol(struct scanner *s) { - return peek(s) == '\n'; + return scanner_peek(s) == '\n'; } static inline void -skip_to_eol(struct scanner *s) +scanner_skip_to_eol(struct scanner *s) { const char *nl = memchr(s->s + s->pos, '\n', s->len - s->pos); const size_t new_pos = nl ? (size_t) (nl - s->s) : s->len; @@ -114,11 +127,11 @@ skip_to_eol(struct scanner *s) } static inline char -next(struct scanner *s) +scanner_next(struct scanner *s) { - if (unlikely(eof(s))) + if (unlikely(scanner_eof(s))) return '\0'; - if (unlikely(eol(s))) { + if (unlikely(scanner_eol(s))) { s->line++; s->column = 1; } @@ -129,16 +142,16 @@ next(struct scanner *s) } static inline bool -chr(struct scanner *s, char ch) +scanner_chr(struct scanner *s, char ch) { - if (likely(peek(s) != ch)) + if (likely(scanner_peek(s) != ch)) return false; s->pos++; s->column++; return true; } static inline bool -str(struct scanner *s, const char *string, size_t len) +scanner_str(struct scanner *s, const char *string, size_t len) { if (s->len - s->pos < len) return false; @@ -148,10 +161,10 @@ str(struct scanner *s, const char *string, size_t len) return true; } -#define lit(s, literal) str(s, literal, sizeof(literal) - 1) +#define scanner_lit(s, literal) scanner_str(s, literal, sizeof(literal) - 1) static inline bool -buf_append(struct scanner *s, char ch) +scanner_buf_append(struct scanner *s, char ch) { if (s->buf_pos + 1 >= sizeof(s->buf)) return false; @@ -160,7 +173,7 @@ buf_append(struct scanner *s, char ch) } static inline bool -buf_appends(struct scanner *s, const char *str) +scanner_buf_appends(struct scanner *s, const char *str) { int ret; ret = snprintf(s->buf + s->buf_pos, sizeof(s->buf) - s->buf_pos, "%s", str); @@ -171,23 +184,32 @@ buf_appends(struct scanner *s, const char *str) } static inline bool -oct(struct scanner *s, uint8_t *out) +scanner_oct(struct scanner *s, uint8_t *out) { int i; - for (i = 0, *out = 0; peek(s) >= '0' && peek(s) <= '7' && i < 3; i++) - *out = *out * 8 + next(s) - '0'; + for (i = 0, *out = 0; scanner_peek(s) >= '0' && scanner_peek(s) <= '7' && i < 3; i++) + /* Test overflow */ + if (*out < 040) { + *out = *out * 8 + scanner_next(s) - '0'; + } else { + /* Consume valid digit, but mark result as invalid */ + scanner_next(s); + return false; + } return i > 0; } static inline bool -hex(struct scanner *s, uint8_t *out) +scanner_hex(struct scanner *s, uint8_t *out) { int i; - for (i = 0, *out = 0; is_xdigit(peek(s)) && i < 2; i++) { - const char c = next(s); + for (i = 0, *out = 0; is_xdigit(scanner_peek(s)) && i < 2; i++) { + const char c = scanner_next(s); const char offset = (c >= '0' && c <= '9' ? '0' : c >= 'a' && c <= 'f' ? 'a' - 10 : 'A' - 10); - *out = *out * 16 + c - offset; + + if (*out * 16 + c >= offset) + *out = *out * 16 + c - offset; } return i > 0; }