Tools: Improve xkbcli help messages and manual pages
[platform/upstream/libxkbcommon.git] / src / scanner-utils.h
index cede0ff..674ecaa 100644 (file)
@@ -57,15 +57,28 @@ struct scanner {
     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__)
 
@@ -175,7 +188,14 @@ scanner_oct(struct scanner *s, uint8_t *out)
 {
     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;
 }