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:%zu:%zu: " fmt "\n", \
- (scanner)->file_name, \
- (scanner)->token_line, (scanner)->token_column, ##__VA_ARGS__)
+ (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__)
{
int i;
for (i = 0, *out = 0; scanner_peek(s) >= '0' && scanner_peek(s) <= '7' && i < 3; i++)
- *out = *out * 8 + scanner_next(s) - '0';
+ /* 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;
}