From 1c61b198c9f5907f6907a215691f6e6652e19a75 Mon Sep 17 00:00:00 2001 From: Pierre Le Marre Date: Thu, 21 Sep 2023 20:06:27 +0200 Subject: [PATCH] Messages: add new messages ID MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit rename conflicting-key-type Rename `conflicting-key-type` to `conflicting-key-type-merging-groups`. Giving more context in the name allow us to introduce `conflicting-key-type-definitions` later. Messages: add conflicting-key-type-definitions Messages: add conflicting-key-type-map-entry Messages: undeclared-modifiers-in-key-type Also improve the log messages. Messages: add conflicting-key-type-preserve-entries Messages: use XKB_ERROR_UNSUPPORTED_MODIFIER_MASK Messages: add illegal-key-type-preserve-result Messages: add conflicting-key-type-level-names Messages: add duplicate-entry Messages: add unsupported-symbols-field Messages: add missing-symbols-group-name-index Messages: use XKB_ERROR_WRONG_FIELD_TYPE Message: add conflicting-key-name Messages: use XKB_WARNING_UNDEFINED_KEYCODE Messages: add illegal-keycode-alias Messages: add unsupported-geometry-section Messages: add missing-default-section Messages: add XKB_LOG_MESSAGE_NO_ID Messages: rename log_vrb_with_code to log_vrb Messages: ERROR_WRONG_FIELD_TYPE & ERROR_INVALID_SYNTAX Messages: add unknown-identifier Messages: add invalid-expression-type Messages: add invalid-operation + fixes Messages: add unknown-operator ERROR_UNKNOWN_IDENTIFIER → ERROR_INVALID_IDENTIFIER Messages: add undeclared-virtual-modifier Messages: add expected-array-entry Messages: add invalid-include-statement Messages: add included-file-not-found Messages: add allocation-error Message: add invalid-included-file Messages: symbols Messages: add invalid-value Messages: add invalid-real-modifier Messages: add unknown-field Messages: add wrong-scope Messages: add invalid-modmap-entry Messages: add wrong-statement-type Messages: add conflicting-key-symbols-entry Messages: add invalid-set-default-statement --- doc/message-registry.md | 336 ++++++++++++++++++++++++++++++++++++- doc/message-registry.yaml | 172 ++++++++++++++++++- src/context.h | 4 +- src/messages-codes.h | 76 ++++++++- src/messages-codes.h.jinja | 8 + src/xkbcomp/ast-build.c | 4 +- src/xkbcomp/expr.c | 132 +++++++++++---- src/xkbcomp/include.c | 39 +++-- src/xkbcomp/keycodes.c | 10 +- src/xkbcomp/keymap.c | 1 + src/xkbcomp/parser.y | 1 + src/xkbcomp/symbols.c | 81 +++++---- src/xkbcomp/types.c | 43 +++-- src/xkbcomp/xkbcomp-priv.h | 6 +- test/log.c | 9 +- tools/messages.c | 35 +++- 16 files changed, 846 insertions(+), 111 deletions(-) diff --git a/doc/message-registry.md b/doc/message-registry.md index dac417599..a3be5c185 100644 --- a/doc/message-registry.md +++ b/doc/message-registry.md @@ -6,7 +6,7 @@ NOTE: This file has been generated automatically by “update-message-registry.p --> This page lists the warnings and errors generated by xkbcommon. -There are currently 21 entries. +There are currently 52 entries. @todo The documentation of the log messages is a work in progress. @@ -15,26 +15,57 @@ There are currently 21 entries. | Code | Identifier | Description | Type | | --------- | ---------------------------- | ----------- | ---- | | [XKB-034] | `malformed-number-literal` | Warn on malformed number literals | Error | +| [XKB-043] | `conflicting-key-type-preserve-entries` | Conflicting “preserve” entries in a key type | Warning | | [XKB-060] | `unsupported-modifier-mask` | Warn on unsupported modifier mask | Error | +| [XKB-077] | `expected-array-entry` | Expected an array entry, but the index is missing | Error | +| [XKB-101] | `illegal-keycode-alias` | Illegal keycode alias with the name of a real key | Warning | | [XKB-107] | `unrecognized-keysym` | Warn on unrecognized keysyms | Warning | +| [XKB-123] | `undeclared-virtual-modifier` | A virtual modifier is used before being declared | Error | +| [XKB-150] | `wrong-statement-type` | The type of the statement is not allowed in the context | Error | +| [XKB-172] | `unsupported-geometry-section` | Geometry sections are not supported | Warning | | [XKB-183] | `cannot-infer-key-type` | Warn if no key type can be inferred | Warning | +| [XKB-195] | `illegal-key-type-preserve-result` | The result of a key type “preserve” entry must be a subset of its input modifiers. | Warning | +| [XKB-203] | `invalid-include-statement` | Syntax error in the include statement | Error | +| [XKB-206] | `invalid-modmap-entry` | A modmap entry is invalid | Error | | [XKB-237] | `unsupported-group-index` | Warn when a group index is not supported | Error | +| [XKB-239] | `conflicting-key-type-level-names` | The name of a key type level is defined multiple times. | Warning | +| [XKB-254] | `invalid-set-default-statement` | Invalid statement setting default values | Error | +| [XKB-266] | `conflicting-key-type-map-entry` | Conflicting “map” entries in type definition | Warning | | [XKB-286] | `undefined-key-type` | Warn if using an undefined key type | Warning | | [XKB-305] | `non-base-group-name` | Warn if a group name was defined for group other than the first one | Warning | | [XKB-312] | `unsupported-shift-level` | Warn when a shift level is not supported | Error | +| [XKB-338] | `included-file-not-found` | Could not find a file used in an include statement | Error | +| [XKB-345] | `unknown-operator` | Use of an operator that is unknown and thus unsupported | Error | +| [XKB-378] | `duplicate-entry` | An entry is duplicated and will be ignored | Warning | +| [XKB-407] | `conflicting-key-type-definitions` | Conflicting definitions of a key type | Warning | +| [XKB-428] | `wrong-scope` | A statement is in a wrong scope and should be moved | Error | +| [XKB-433] | `missing-default-section` | Missing default section in included file | Warning | | [XKB-461] | `conflicting-key-symbol` | Warn if there are conflicting keysyms while merging keys | Warning | +| [XKB-478] | `invalid-operation` | The operation is invalid in the context | Error | | [XKB-489] | `numeric-keysym` | Warn on numeric keysym (other than 0-9) | Warning | | [XKB-516] | `extra-symbols-ignored` | TODO: add description | Warning | +| [XKB-523] | `conflicting-key-name` | Conflicting definitions of a key name or alias | Warning | +| [XKB-550] | `allocation-error` | Cannot allocate memory | Error | | [XKB-578] | `wrong-field-type` | Warn when a field has not the expected type | Error | +| [XKB-623] | `invalid-real-modifier` | Invalid _real_ modifier | Error | | [XKB-645] | `unknown-char-escape-sequence` | Warn on unknown escape sequence in string literal | Warning | +| [XKB-661] | `invalid-included-file` | The target file of an include statement could not be processed | Error | | [XKB-700] | `multiple-groups-at-once` | Warn if a key defines multiple groups at once | Warning | +| [XKB-711] | `unsupported-symbols-field` | A legacy X11 symbol field is not supported | Warning | | [XKB-769] | `invalid-syntax` | The syntax is invalid and the file cannot be parsed | Error | -| [XKB-770] | `undefined-keycode` | TODO: add description | Warning | +| [XKB-770] | `undefined-keycode` | Reference to an undefined keycode | Warning | +| [XKB-784] | `invalid-expression-type` | An expression has not the expected type | Error | +| [XKB-796] | `invalid-value` | A value is invalid and will be ignored | Error | | [XKB-800] | `conflicting-modmap` | Warn if there are conflicting modmap definitions | Warning | +| [XKB-812] | `unknown-field` | A field is unknown and will be ignored | Error | | [XKB-883] | `conflicting-key-action` | Warn if there are conflicting actions while merging keys | Warning | -| [XKB-893] | `conflicting-key-type` | Warn if there are conflicting key types while merging groups | Warning | +| [XKB-893] | `conflicting-key-type-merging-groups` | Warn if there are conflicting key types while merging groups | Warning | +| [XKB-901] | `conflicting-key-symbols-entry` | Conflicting symbols entry for a key | Error | +| [XKB-903] | `missing-symbols-group-name-index` | Missing group index in a group name entry | Warning | | [XKB-935] | `conflicting-key-fields` | Warn if there are conflicting fields while merging keys | Warning | +| [XKB-949] | `invalid-identifier` | An identifier is used but is not built-in | Error | | [XKB-965] | `unresolved-keymap-symbol` | Warn if using a symbol not defined in the keymap | Warning | +| [XKB-971] | `undeclared-modifiers-in-key-type` | Some modifiers used in a key type “map” or “preserve” entry are not declared | Warning | ## Details @@ -53,6 +84,14 @@ xkbcommon can parse the following number literal formats: - *hexadecimal integer:* prefixed with “0x”: 0x123, 0xff, 0xAB, etc. +### XKB-043 – Conflicting key type preserve entries {#XKB-043} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Conflicting “preserve” entries in a key type
+
+ ### XKB-060 – Unsupported modifier mask {#XKB-060}
@@ -61,6 +100,22 @@ xkbcommon can parse the following number literal formats:
Summary
Warn on unsupported modifier mask
+### XKB-077 – Expected array entry {#XKB-077} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Expected an array entry, but the index is missing
+
+ +### XKB-101 – Illegal keycode alias {#XKB-101} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Illegal keycode alias with the name of a real key
+
+ ### XKB-107 – Unrecognized keysym {#XKB-107}
@@ -111,6 +166,30 @@ key {[ comma, semicolon, periodcentered, multiply ]}; +### XKB-123 – Undeclared virtual modifier {#XKB-123} + +
+
Since
1.0.0
+
Type
Error
+
Summary
A virtual modifier is used before being declared
+
+ +### XKB-150 – Wrong statement type {#XKB-150} + +
+
Since
1.0.0
+
Type
Error
+
Summary
The type of the statement is not allowed in the context
+
+ +### XKB-172 – Unsupported geometry section {#XKB-172} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Geometry sections are not supported
+
+ ### XKB-183 – Cannot infer key type {#XKB-183}
@@ -119,6 +198,30 @@ key {[ comma, semicolon, periodcentered, multiply ]};
Summary
Warn if no key type can be inferred
+### XKB-195 – Illegal key type preserve result {#XKB-195} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
The result of a key type “preserve” entry must be a subset of its input modifiers.
+
+ +### XKB-203 – Invalid include statement {#XKB-203} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Syntax error in the include statement
+
+ +### XKB-206 – Invalid modmap entry {#XKB-206} + +
+
Since
1.0.0
+
Type
Error
+
Summary
A modmap entry is invalid
+
+ ### XKB-237 – Unsupported group index {#XKB-237}
@@ -130,6 +233,30 @@ key {[ comma, semicolon, periodcentered, multiply ]}; xkbcommon supports group index in the range (1..4). +### XKB-239 – Conflicting key type level names {#XKB-239} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
The name of a key type level is defined multiple times.
+
+ +### XKB-254 – Invalid set default statement {#XKB-254} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Invalid statement setting default values
+
+ +### XKB-266 – Conflicting key type map entry {#XKB-266} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Conflicting “map” entries in type definition
+
+ ### XKB-286 – Undefined key type {#XKB-286}
@@ -158,6 +285,66 @@ Shift levels are _one_-indexed. xkbcommon supports two formats of shift levels: as numbers and as identifiers `LevelN`, where `N` is in the range (1..8). +### XKB-338 – Included file not found {#XKB-338} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Could not find a file used in an include statement
+
+ +### XKB-345 – Unknown operator {#XKB-345} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Use of an operator that is unknown and thus unsupported
+
+ +### XKB-378 – Duplicate entry {#XKB-378} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
An entry is duplicated and will be ignored
+
+ +### XKB-407 – Conflicting key type definitions {#XKB-407} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Conflicting definitions of a key type
+
+ +The given key type is defined multiple times, but only one definition is kept. + + +### XKB-428 – Wrong scope {#XKB-428} + +
+
Since
1.0.0
+
Type
Error
+
Summary
A statement is in a wrong scope and should be moved
+
+ +### XKB-433 – Missing default section {#XKB-433} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Missing default section in included file
+
+ +When using an include statement, the included file may contains multiple sections. +The include statement may specify the name of the section to include, or leave it +unspecified. In the latter case, the included file must then define a *default* section. +The present warning is shown when no default section is defined. + +To solve this, either fix the include statement by specifying the exact section to +include, or declare a default section in the included file. + + ### XKB-461 – Conflicting key symbol {#XKB-461}
@@ -166,6 +353,14 @@ as numbers and as identifiers `LevelN`, where `N` is in the range (1..8).
Summary
Warn if there are conflicting keysyms while merging keys
+### XKB-478 – Invalid operation {#XKB-478} + +
+
Since
1.0.0
+
Type
Error
+
Summary
The operation is invalid in the context
+
+ ### XKB-489 – Numeric keysym {#XKB-489}
@@ -221,6 +416,22 @@ key { [ U1ED0 ] };
Summary
TODO: add description
+### XKB-523 – Conflicting key name {#XKB-523} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Conflicting definitions of a key name or alias
+
+ +### XKB-550 – Allocation error {#XKB-550} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Cannot allocate memory
+
+ ### XKB-578 – Wrong field type {#XKB-578}
@@ -229,6 +440,14 @@ key { [ U1ED0 ] };
Summary
Warn when a field has not the expected type
+### XKB-623 – Invalid real modifier {#XKB-623} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Invalid _real_ modifier
+
+ ### XKB-645 – Unknown char escape sequence {#XKB-645}
@@ -252,6 +471,14 @@ xkbcommon support the following escape sequences in string literals: | `\NNN` | _Octal_ escape, from `\0` to `\777` | +### XKB-661 – Invalid included file {#XKB-661} + +
+
Since
1.0.0
+
Type
Error
+
Summary
The target file of an include statement could not be processed
+
+ ### XKB-700 – Multiple groups at once {#XKB-700}
@@ -260,6 +487,14 @@ xkbcommon support the following escape sequences in string literals:
Summary
Warn if a key defines multiple groups at once
+### XKB-711 – Unsupported symbols field {#XKB-711} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
A legacy X11 symbol field is not supported
+
+ ### XKB-769 – Invalid syntax {#XKB-769}
@@ -273,7 +508,23 @@ xkbcommon support the following escape sequences in string literals:
Since
1.0.0
Type
Warning
-
Summary
TODO: add description
+
Summary
Reference to an undefined keycode
+
+ +### XKB-784 – Invalid expression type {#XKB-784} + +
+
Since
1.0.0
+
Type
Error
+
Summary
An expression has not the expected type
+
+ +### XKB-796 – Invalid value {#XKB-796} + +
+
Since
1.0.0
+
Type
Error
+
Summary
A value is invalid and will be ignored
### XKB-800 – Conflicting modmap {#XKB-800} @@ -287,6 +538,14 @@ xkbcommon support the following escape sequences in string literals: @todo detailed explanation and examples +### XKB-812 – Unknown field {#XKB-812} + +
+
Since
1.0.0
+
Type
Error
+
Summary
A field is unknown and will be ignored
+
+ ### XKB-883 – Conflicting key action {#XKB-883}
@@ -295,7 +554,7 @@ xkbcommon support the following escape sequences in string literals:
Summary
Warn if there are conflicting actions while merging keys
-### XKB-893 – Conflicting key type {#XKB-893} +### XKB-893 – Conflicting key type merging groups {#XKB-893}
Since
1.0.0
@@ -303,6 +562,22 @@ xkbcommon support the following escape sequences in string literals:
Summary
Warn if there are conflicting key types while merging groups
+### XKB-901 – Conflicting key symbols entry {#XKB-901} + +
+
Since
1.0.0
+
Type
Error
+
Summary
Conflicting symbols entry for a key
+
+ +### XKB-903 – Missing symbols group name index {#XKB-903} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Missing group index in a group name entry
+
+ ### XKB-935 – Conflicting key fields {#XKB-935}
@@ -311,6 +586,14 @@ xkbcommon support the following escape sequences in string literals:
Summary
Warn if there are conflicting fields while merging keys
+### XKB-949 – Invalid identifier {#XKB-949} + +
+
Since
1.0.0
+
Type
Error
+
Summary
An identifier is used but is not built-in
+
+ ### XKB-965 – Unresolved keymap symbol {#XKB-965}
@@ -319,24 +602,67 @@ xkbcommon support the following escape sequences in string literals:
Summary
Warn if using a symbol not defined in the keymap
+### XKB-971 – Undeclared modifiers in key type {#XKB-971} + +
+
Since
1.0.0
+
Type
Warning
+
Summary
Some modifiers used in a key type “map” or “preserve” entry are not declared
+
+ +The modifiers used in `map` or `preserve` entries should be declared using the entry +`modifiers` in the key type. + + [XKB-034]: @ref XKB-034 +[XKB-043]: @ref XKB-043 [XKB-060]: @ref XKB-060 +[XKB-077]: @ref XKB-077 +[XKB-101]: @ref XKB-101 [XKB-107]: @ref XKB-107 +[XKB-123]: @ref XKB-123 +[XKB-150]: @ref XKB-150 +[XKB-172]: @ref XKB-172 [XKB-183]: @ref XKB-183 +[XKB-195]: @ref XKB-195 +[XKB-203]: @ref XKB-203 +[XKB-206]: @ref XKB-206 [XKB-237]: @ref XKB-237 +[XKB-239]: @ref XKB-239 +[XKB-254]: @ref XKB-254 +[XKB-266]: @ref XKB-266 [XKB-286]: @ref XKB-286 [XKB-305]: @ref XKB-305 [XKB-312]: @ref XKB-312 +[XKB-338]: @ref XKB-338 +[XKB-345]: @ref XKB-345 +[XKB-378]: @ref XKB-378 +[XKB-407]: @ref XKB-407 +[XKB-428]: @ref XKB-428 +[XKB-433]: @ref XKB-433 [XKB-461]: @ref XKB-461 +[XKB-478]: @ref XKB-478 [XKB-489]: @ref XKB-489 [XKB-516]: @ref XKB-516 +[XKB-523]: @ref XKB-523 +[XKB-550]: @ref XKB-550 [XKB-578]: @ref XKB-578 +[XKB-623]: @ref XKB-623 [XKB-645]: @ref XKB-645 +[XKB-661]: @ref XKB-661 [XKB-700]: @ref XKB-700 +[XKB-711]: @ref XKB-711 [XKB-769]: @ref XKB-769 [XKB-770]: @ref XKB-770 +[XKB-784]: @ref XKB-784 +[XKB-796]: @ref XKB-796 [XKB-800]: @ref XKB-800 +[XKB-812]: @ref XKB-812 [XKB-883]: @ref XKB-883 [XKB-893]: @ref XKB-893 +[XKB-901]: @ref XKB-901 +[XKB-903]: @ref XKB-903 [XKB-935]: @ref XKB-935 +[XKB-949]: @ref XKB-949 [XKB-965]: @ref XKB-965 +[XKB-971]: @ref XKB-971 diff --git a/doc/message-registry.yaml b/doc/message-registry.yaml index f7e0c2e17..880c2f6a4 100644 --- a/doc/message-registry.yaml +++ b/doc/message-registry.yaml @@ -30,11 +30,26 @@ - *decimal integer:* 1, 123, etc. - *decimal floating-point number:* 1.23, etc. - *hexadecimal integer:* prefixed with “0x”: 0x123, 0xff, 0xAB, etc. +- id: "conflicting-key-type-preserve-entries" + code: 43 + added: ALWAYS + type: warning + description: "Conflicting “preserve” entries in a key type" - id: "unsupported-modifier-mask" code: 60 added: ALWAYS type: error description: "Warn on unsupported modifier mask" +- id: "expected-array-entry" + code: 77 + added: ALWAYS + type: error + description: "Expected an array entry, but the index is missing" +- id: "illegal-keycode-alias" + code: 101 + added: ALWAYS + type: warning + description: "Illegal keycode alias with the name of a real key" - id: "unrecognized-keysym" code: 107 added: ALWAYS @@ -65,11 +80,41 @@ ```c key {[ comma, semicolon, periodcentered, multiply ]}; ``` +- id: "undeclared-virtual-modifier" + code: 123 + added: ALWAYS + type: error + description: "A virtual modifier is used before being declared" +- id: "wrong-statement-type" + code: 150 + added: ALWAYS + type: error + description: "The type of the statement is not allowed in the context" +- id: "unsupported-geometry-section" + code: 172 + added: ALWAYS + type: warning + description: "Geometry sections are not supported" - id: "cannot-infer-key-type" code: 183 added: ALWAYS type: warning description: "Warn if no key type can be inferred" +- id: "illegal-key-type-preserve-result" + code: 195 + added: ALWAYS + type: warning + description: "The result of a key type “preserve” entry must be a subset of its input modifiers." +- id: "invalid-include-statement" + code: 203 + added: ALWAYS + type: error + description: "Syntax error in the include statement" +- id: "invalid-modmap-entry" + code: 206 + added: ALWAYS + type: error + description: "A modmap entry is invalid" - id: "unsupported-group-index" code: 237 added: ALWAYS @@ -77,6 +122,21 @@ description: "Warn when a group index is not supported" details: | xkbcommon supports group index in the range (1..{{XKB_MAX_GROUPS}}). +- id: "conflicting-key-type-level-names" + code: 239 + added: ALWAYS + type: warning + description: "The name of a key type level is defined multiple times." +- id: "invalid-set-default-statement" + code: 254 + added: ALWAYS + type: error + description: "Invalid statement setting default values" +- id: "conflicting-key-type-map-entry" + code: 266 + added: ALWAYS + type: warning + description: "Conflicting “map” entries in type definition" - id: "undefined-key-type" code: 286 added: ALWAYS @@ -95,11 +155,56 @@ details: | Shift levels are _one_-indexed. xkbcommon supports two formats of shift levels: as numbers and as identifiers `LevelN`, where `N` is in the range (1..8). +- id: "included-file-not-found" + code: 338 + added: ALWAYS + type: error + description: "Could not find a file used in an include statement" +- id: "unknown-operator" + code: 345 + added: ALWAYS + type: error + description: "Use of an operator that is unknown and thus unsupported" +- id: "duplicate-entry" + code: 378 + added: ALWAYS + type: warning + description: "An entry is duplicated and will be ignored" +- id: "conflicting-key-type-definitions" + code: 407 + added: ALWAYS + type: warning + description: "Conflicting definitions of a key type" + details: | + The given key type is defined multiple times, but only one definition is kept. +- id: "wrong-scope" + code: 428 + added: ALWAYS + type: error + description: "A statement is in a wrong scope and should be moved" +- id: "missing-default-section" + code: 433 + added: ALWAYS + type: warning + description: "Missing default section in included file" + details: | + When using an include statement, the included file may contains multiple sections. + The include statement may specify the name of the section to include, or leave it + unspecified. In the latter case, the included file must then define a *default* section. + The present warning is shown when no default section is defined. + + To solve this, either fix the include statement by specifying the exact section to + include, or declare a default section in the included file. - id: "conflicting-key-symbol" code: 461 added: ALWAYS type: warning description: "Warn if there are conflicting keysyms while merging keys" +- id: "invalid-operation" + code: 478 + added: ALWAYS + type: error + description: "The operation is invalid in the context" - id: "numeric-keysym" code: 489 added: 1.6.0 @@ -132,11 +237,26 @@ added: ALWAYS type: warning description: "TODO: add description" +- id: "conflicting-key-name" + code: 523 + added: ALWAYS + type: warning + description: "Conflicting definitions of a key name or alias" +- id: "allocation-error" + code: 550 + added: ALWAYS + type: error + description: "Cannot allocate memory" - id: "wrong-field-type" code: 578 added: ALWAYS type: error description: "Warn when a field has not the expected type" +- id: "invalid-real-modifier" + code: 623 + added: ALWAYS + type: error + description: "Invalid _real_ modifier" - id: "unknown-char-escape-sequence" code: 645 added: ALWAYS @@ -156,11 +276,21 @@ | `\e` | `U+001B` Escape | | `\\` | `U+005C` Backslash | | `\NNN` | _Octal_ escape, from `\0` to `\777` | +- id: "invalid-included-file" + code: 661 + added: ALWAYS + type: error + description: "The target file of an include statement could not be processed" - id: "multiple-groups-at-once" code: 700 added: ALWAYS type: warning description: "Warn if a key defines multiple groups at once" +- id: "unsupported-symbols-field" + code: 711 + added: ALWAYS + type: warning + description: "A legacy X11 symbol field is not supported" - id: "invalid-syntax" code: 769 added: ALWAYS @@ -170,7 +300,17 @@ code: 770 added: ALWAYS type: warning - description: "TODO: add description" + description: "Reference to an undefined keycode" +- id: "invalid-expression-type" + code: 784 + added: ALWAYS + type: error + description: "An expression has not the expected type" +- id: "invalid-value" + code: 796 + added: ALWAYS + type: error + description: "A value is invalid and will be ignored" - id: "conflicting-modmap" code: 800 added: ALWAYS @@ -178,26 +318,54 @@ description: "Warn if there are conflicting modmap definitions" details: | @todo detailed explanation and examples +- id: "unknown-field" + code: 812 + added: ALWAYS + type: error + description: "A field is unknown and will be ignored" - id: "conflicting-key-action" code: 883 added: ALWAYS type: warning description: "Warn if there are conflicting actions while merging keys" -- id: "conflicting-key-type" +- id: "conflicting-key-type-merging-groups" code: 893 added: ALWAYS type: warning description: "Warn if there are conflicting key types while merging groups" +- id: "conflicting-key-symbols-entry" + code: 901 + added: ALWAYS + type: error + description: "Conflicting symbols entry for a key" +- id: "missing-symbols-group-name-index" + code: 903 + added: ALWAYS + type: warning + description: "Missing group index in a group name entry" - id: "conflicting-key-fields" code: 935 added: ALWAYS type: warning description: "Warn if there are conflicting fields while merging keys" +- id: "invalid-identifier" + code: 949 + added: ALWAYS + type: error + description: "An identifier is used but is not built-in" - id: "unresolved-keymap-symbol" code: 965 added: ALWAYS type: warning description: "Warn if using a symbol not defined in the keymap" +- id: "undeclared-modifiers-in-key-type" + code: 971 + added: ALWAYS + type: warning + description: "Some modifiers used in a key type “map” or “preserve” entry are not declared" + details: | + The modifiers used in `map` or `preserve` entries should be declared using the entry + `modifiers` in the key type. # TODO: deprecated keysym # TODO: unicode keysym when named and recommended keysym exists diff --git a/src/context.h b/src/context.h index d5fa117b2..53d6e2f31 100644 --- a/src/context.h +++ b/src/context.h @@ -138,10 +138,8 @@ xkb_context_sanitize_rule_names(struct xkb_context *ctx, xkb_log_with_code((ctx), XKB_LOG_LEVEL_CRITICAL, 0, (id), __VA_ARGS__) #define log_wsgo(ctx, ...) \ xkb_log((ctx), XKB_LOG_LEVEL_CRITICAL, 0, __VA_ARGS__) -#define log_vrb_with_code(ctx, vrb, id, ...) \ +#define log_vrb(ctx, vrb, id, ...) \ xkb_log_with_code((ctx), XKB_LOG_LEVEL_WARNING, (vrb), (id), __VA_ARGS__) -#define log_vrb(ctx, vrb, ...) \ - xkb_log((ctx), XKB_LOG_LEVEL_WARNING, (vrb), __VA_ARGS__) /* * Variants which are prefixed by the name of the function they're diff --git a/src/messages-codes.h b/src/messages-codes.h index 1ba568c63..3f117e1a1 100644 --- a/src/messages-codes.h +++ b/src/messages-codes.h @@ -6,6 +6,14 @@ #include +/** + * Special case when no message identifier is defined. + * + * @added 1.6.0 + * + */ +#define XKB_LOG_MESSAGE_NO_ID 0 + /** * @name Codes of the log messages * @@ -16,47 +24,109 @@ enum xkb_message_code { _XKB_LOG_MESSAGE_MIN_CODE = 34, /** Warn on malformed number literals */ XKB_ERROR_MALFORMED_NUMBER_LITERAL = 34, + /** Conflicting “preserve” entries in a key type */ + XKB_WARNING_CONFLICTING_KEY_TYPE_PRESERVE_ENTRIES = 43, /** Warn on unsupported modifier mask */ XKB_ERROR_UNSUPPORTED_MODIFIER_MASK = 60, + /** Expected an array entry, but the index is missing */ + XKB_ERROR_EXPECTED_ARRAY_ENTRY = 77, + /** Illegal keycode alias with the name of a real key */ + XKB_WARNING_ILLEGAL_KEYCODE_ALIAS = 101, /** Warn on unrecognized keysyms */ XKB_WARNING_UNRECOGNIZED_KEYSYM = 107, + /** A virtual modifier is used before being declared */ + XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER = 123, + /** The type of the statement is not allowed in the context */ + XKB_ERROR_WRONG_STATEMENT_TYPE = 150, + /** Geometry sections are not supported */ + XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION = 172, /** Warn if no key type can be inferred */ XKB_WARNING_CANNOT_INFER_KEY_TYPE = 183, + /** The result of a key type “preserve” entry must be a subset of its input modifiers. */ + XKB_WARNING_ILLEGAL_KEY_TYPE_PRESERVE_RESULT = 195, + /** Syntax error in the include statement */ + XKB_ERROR_INVALID_INCLUDE_STATEMENT = 203, + /** A modmap entry is invalid */ + XKB_ERROR_INVALID_MODMAP_ENTRY = 206, /** Warn when a group index is not supported */ XKB_ERROR_UNSUPPORTED_GROUP_INDEX = 237, + /** The name of a key type level is defined multiple times. */ + XKB_WARNING_CONFLICTING_KEY_TYPE_LEVEL_NAMES = 239, + /** Invalid statement setting default values */ + XKB_ERROR_INVALID_SET_DEFAULT_STATEMENT = 254, + /** Conflicting “map” entries in type definition */ + XKB_WARNING_CONFLICTING_KEY_TYPE_MAP_ENTRY = 266, /** Warn if using an undefined key type */ XKB_WARNING_UNDEFINED_KEY_TYPE = 286, /** Warn if a group name was defined for group other than the first one */ XKB_WARNING_NON_BASE_GROUP_NAME = 305, /** Warn when a shift level is not supported */ XKB_ERROR_UNSUPPORTED_SHIFT_LEVEL = 312, + /** Could not find a file used in an include statement */ + XKB_ERROR_INCLUDED_FILE_NOT_FOUND = 338, + /** Use of an operator that is unknown and thus unsupported */ + XKB_ERROR_UNKNOWN_OPERATOR = 345, + /** An entry is duplicated and will be ignored */ + XKB_WARNING_DUPLICATE_ENTRY = 378, + /** Conflicting definitions of a key type */ + XKB_WARNING_CONFLICTING_KEY_TYPE_DEFINITIONS = 407, + /** A statement is in a wrong scope and should be moved */ + XKB_ERROR_WRONG_SCOPE = 428, + /** Missing default section in included file */ + XKB_WARNING_MISSING_DEFAULT_SECTION = 433, /** Warn if there are conflicting keysyms while merging keys */ XKB_WARNING_CONFLICTING_KEY_SYMBOL = 461, + /** The operation is invalid in the context */ + XKB_ERROR_INVALID_OPERATION = 478, /** Warn on numeric keysym (other than 0-9) */ XKB_WARNING_NUMERIC_KEYSYM = 489, /** TODO: add description */ XKB_WARNING_EXTRA_SYMBOLS_IGNORED = 516, + /** Conflicting definitions of a key name or alias */ + XKB_WARNING_CONFLICTING_KEY_NAME = 523, + /** Cannot allocate memory */ + XKB_ERROR_ALLOCATION_ERROR = 550, /** Warn when a field has not the expected type */ XKB_ERROR_WRONG_FIELD_TYPE = 578, + /** Invalid _real_ modifier */ + XKB_ERROR_INVALID_REAL_MODIFIER = 623, /** Warn on unknown escape sequence in string literal */ XKB_WARNING_UNKNOWN_CHAR_ESCAPE_SEQUENCE = 645, + /** The target file of an include statement could not be processed */ + XKB_ERROR_INVALID_INCLUDED_FILE = 661, /** Warn if a key defines multiple groups at once */ XKB_WARNING_MULTIPLE_GROUPS_AT_ONCE = 700, + /** A legacy X11 symbol field is not supported */ + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD = 711, /** The syntax is invalid and the file cannot be parsed */ XKB_ERROR_INVALID_SYNTAX = 769, - /** TODO: add description */ + /** Reference to an undefined keycode */ XKB_WARNING_UNDEFINED_KEYCODE = 770, + /** An expression has not the expected type */ + XKB_ERROR_INVALID_EXPRESSION_TYPE = 784, + /** A value is invalid and will be ignored */ + XKB_ERROR_INVALID_VALUE = 796, /** Warn if there are conflicting modmap definitions */ XKB_WARNING_CONFLICTING_MODMAP = 800, + /** A field is unknown and will be ignored */ + XKB_ERROR_UNKNOWN_FIELD = 812, /** Warn if there are conflicting actions while merging keys */ XKB_WARNING_CONFLICTING_KEY_ACTION = 883, /** Warn if there are conflicting key types while merging groups */ - XKB_WARNING_CONFLICTING_KEY_TYPE = 893, + XKB_WARNING_CONFLICTING_KEY_TYPE_MERGING_GROUPS = 893, + /** Conflicting symbols entry for a key */ + XKB_ERROR_CONFLICTING_KEY_SYMBOLS_ENTRY = 901, + /** Missing group index in a group name entry */ + XKB_WARNING_MISSING_SYMBOLS_GROUP_NAME_INDEX = 903, /** Warn if there are conflicting fields while merging keys */ XKB_WARNING_CONFLICTING_KEY_FIELDS = 935, + /** An identifier is used but is not built-in */ + XKB_ERROR_INVALID_IDENTIFIER = 949, /** Warn if using a symbol not defined in the keymap */ XKB_WARNING_UNRESOLVED_KEYMAP_SYMBOL = 965, - _XKB_LOG_MESSAGE_MAX_CODE = 965 + /** Some modifiers used in a key type “map” or “preserve” entry are not declared */ + XKB_WARNING_UNDECLARED_MODIFIERS_IN_KEY_TYPE = 971, + _XKB_LOG_MESSAGE_MAX_CODE = 971 }; typedef uint32_t xkb_message_code_t; diff --git a/src/messages-codes.h.jinja b/src/messages-codes.h.jinja index 2195af46e..49a876cd5 100644 --- a/src/messages-codes.h.jinja +++ b/src/messages-codes.h.jinja @@ -6,6 +6,14 @@ #include +/** + * Special case when no message identifier is defined. + * + * @added 1.6.0 + * + */ +#define XKB_LOG_MESSAGE_NO_ID 0 + /** * @name Codes of the log messages * diff --git a/src/xkbcomp/ast-build.c b/src/xkbcomp/ast-build.c index 347eed868..4654ae4c6 100644 --- a/src/xkbcomp/ast-build.c +++ b/src/xkbcomp/ast-build.c @@ -525,7 +525,9 @@ IncludeCreate(struct xkb_context *ctx, char *str, enum merge_mode merge) return first; err: - log_err(ctx, "Illegal include statement \"%s\"; Ignored\n", stmt); + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDE_STATEMENT, + "Illegal include statement \"%s\"; Ignored\n", stmt); FreeInclude(first); free(stmt); return NULL; diff --git a/src/xkbcomp/expr.c b/src/xkbcomp/expr.c index 558fef3ef..6e3e4515b 100644 --- a/src/xkbcomp/expr.c +++ b/src/xkbcomp/expr.c @@ -63,7 +63,9 @@ ExprResolveLhs(struct xkb_context *ctx, const ExprDef *expr, default: break; } - log_wsgo(ctx, "Unexpected operator %d in ResolveLhs\n", expr->expr.op); + log_wsgo_with_code(ctx, + XKB_ERROR_INVALID_SYNTAX, + "Unexpected operator %d in ResolveLhs\n", expr->expr.op); return false; } @@ -139,7 +141,8 @@ ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_BOOLEAN) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Found constant of type %s where boolean was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; @@ -163,11 +166,15 @@ ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, return true; } } - log_err(ctx, "Identifier \"%s\" of type boolean is unknown\n", ident); + log_err_with_code(ctx, + XKB_ERROR_INVALID_IDENTIFIER, + "Identifier \"%s\" of type boolean is unknown\n", ident); return false; case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type boolean is unknown\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_EXPRESSION_TYPE, + "Default \"%s.%s\" of type boolean is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; @@ -188,12 +195,16 @@ ExprResolveBoolean(struct xkb_context *ctx, const ExprDef *expr, case EXPR_ACTION_DECL: case EXPR_ACTION_LIST: case EXPR_KEYSYM_LIST: - log_err(ctx, "%s of boolean values not permitted\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "%s of boolean values not permitted\n", expr_op_type_to_string(expr->expr.op)); break; default: - log_wsgo(ctx, "Unknown operator %d in ResolveBoolean\n", + log_wsgo_with_code(ctx, + XKB_ERROR_UNKNOWN_OPERATOR, + "Unknown operator %d in ResolveBoolean\n", expr->expr.op); break; } @@ -210,7 +221,8 @@ ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Found constant of type %s where an int was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; @@ -239,7 +251,9 @@ ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, break; case EXPR_DIVIDE: if (rightRtrn == 0) { - log_err(ctx, "Cannot divide by zero: %d / %d\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "Cannot divide by zero: %d / %d\n", leftRtrn, rightRtrn); return false; } @@ -263,8 +277,9 @@ ExprResolveKeyCode(struct xkb_context *ctx, const ExprDef *expr, return ExprResolveKeyCode(ctx, expr->unary.child, kc); default: - log_wsgo(ctx, "Unknown operator %d in ResolveKeyCode\n", - expr->expr.op); + log_wsgo_with_code(ctx, + XKB_ERROR_INVALID_SYNTAX, + "Unknown operator %d in ResolveKeyCode\n", expr->expr.op); break; } @@ -294,7 +309,8 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Found constant of type %s where an int was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; @@ -308,7 +324,9 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, &u); if (!ok) - log_err(ctx, "Identifier \"%s\" of type int is unknown\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_IDENTIFIER, + "Identifier \"%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->ident.ident)); else *val_rtrn = (int) u; @@ -316,7 +334,9 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, return ok; case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_EXPRESSION_TYPE, + "Default \"%s.%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; @@ -343,13 +363,17 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, break; case EXPR_DIVIDE: if (r == 0) { - log_err(ctx, "Cannot divide by zero: %d / %d\n", l, r); + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "Cannot divide by zero: %d / %d\n", l, r); return false; } *val_rtrn = l / r; break; default: - log_err(ctx, "%s of integers not permitted\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "%s of integers not permitted\n", expr_op_type_to_string(expr->expr.op)); return false; } @@ -357,11 +381,15 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, return true; case EXPR_ASSIGN: - log_wsgo(ctx, "Assignment operator not implemented yet\n"); + log_wsgo_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "Assignment operator not implemented yet\n"); break; case EXPR_NOT: - log_err(ctx, "The ! operator cannot be applied to an integer\n"); + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "The ! operator cannot be applied to an integer\n"); return false; case EXPR_INVERT: @@ -379,7 +407,9 @@ ExprResolveIntegerLookup(struct xkb_context *ctx, const ExprDef *expr, lookupPriv); default: - log_wsgo(ctx, "Unknown operator %d in ResolveInteger\n", + log_wsgo_with_code(ctx, + XKB_ERROR_UNKNOWN_OPERATOR, + "Unknown operator %d in ResolveInteger\n", expr->expr.op); break; } @@ -454,7 +484,9 @@ ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_STRING) { - log_err(ctx, "Found constant of type %s, expected a string\n", + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, + "Found constant of type %s, expected a string\n", expr_value_type_to_string(expr->expr.value_type)); return false; } @@ -463,12 +495,16 @@ ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, return true; case EXPR_IDENT: - log_err(ctx, "Identifier \"%s\" of type string not found\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_IDENTIFIER, + "Identifier \"%s\" of type string not found\n", xkb_atom_text(ctx, expr->ident.ident)); return false; case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type string not found\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_EXPRESSION_TYPE, + "Default \"%s.%s\" of type string not found\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; @@ -485,12 +521,16 @@ ExprResolveString(struct xkb_context *ctx, const ExprDef *expr, case EXPR_ACTION_DECL: case EXPR_ACTION_LIST: case EXPR_KEYSYM_LIST: - log_err(ctx, "%s of strings not permitted\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_SYNTAX, + "%s of strings not permitted\n", expr_op_type_to_string(expr->expr.op)); return false; default: - log_wsgo(ctx, "Unknown operator %d in ResolveString\n", + log_wsgo_with_code(ctx, + XKB_ERROR_UNKNOWN_OPERATOR, + "Unknown operator %d in ResolveString\n", expr->expr.op); break; } @@ -502,18 +542,22 @@ ExprResolveEnum(struct xkb_context *ctx, const ExprDef *expr, unsigned int *val_rtrn, const LookupEntry *values) { if (expr->expr.op != EXPR_IDENT) { - log_err(ctx, "Found a %s where an enumerated value was expected\n", + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, + "Found a %s where an enumerated value was expected\n", expr_op_type_to_string(expr->expr.op)); return false; } if (!SimpleLookup(ctx, values, expr->ident.ident, EXPR_TYPE_INT, val_rtrn)) { - log_err(ctx, "Illegal identifier %s; expected one of:\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_IDENTIFIER, + "Illegal identifier %s; expected one of:\n", xkb_atom_text(ctx, expr->ident.ident)); while (values && values->name) { - log_err(ctx, "\t%s\n", values->name); + log_err_with_code(ctx, XKB_ERROR_INVALID_IDENTIFIER, "\t%s\n", values->name); values++; } return false; @@ -536,7 +580,8 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, switch (expr->expr.op) { case EXPR_VALUE: if (expr->expr.value_type != EXPR_TYPE_INT) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Found constant of type %s where a mask was expected\n", expr_value_type_to_string(expr->expr.value_type)); return false; @@ -548,12 +593,16 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, ok = lookup(ctx, lookupPriv, expr->ident.ident, EXPR_TYPE_INT, val_rtrn); if (!ok) - log_err(ctx, "Identifier \"%s\" of type int is unknown\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_IDENTIFIER, + "Identifier \"%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->ident.ident)); return ok; case EXPR_FIELD_REF: - log_err(ctx, "Default \"%s.%s\" of type int is unknown\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_EXPRESSION_TYPE, + "Default \"%s.%s\" of type int is unknown\n", xkb_atom_text(ctx, expr->field_ref.element), xkb_atom_text(ctx, expr->field_ref.field)); return false; @@ -564,7 +613,8 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, case EXPR_ACTION_DECL: if (bogus == NULL) bogus = "function use"; - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Unexpected %s in mask expression; Expression Ignored\n", bogus); return false; @@ -588,7 +638,9 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, break; case EXPR_MULTIPLY: case EXPR_DIVIDE: - log_err(ctx, "Cannot %s masks; Illegal operation ignored\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "Cannot %s masks; Illegal operation ignored\n", (expr->expr.op == EXPR_DIVIDE ? "divide" : "multiply")); return false; default: @@ -598,7 +650,9 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, return true; case EXPR_ASSIGN: - log_wsgo(ctx, "Assignment operator not implemented yet\n"); + log_wsgo_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "Assignment operator not implemented yet\n"); break; case EXPR_INVERT: @@ -614,12 +668,16 @@ ExprResolveMaskLookup(struct xkb_context *ctx, const ExprDef *expr, case EXPR_NOT: left = expr->unary.child; if (!ExprResolveIntegerLookup(ctx, left, &v, lookup, lookupPriv)) - log_err(ctx, "The %s operator cannot be used with a mask\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_OPERATION, + "The %s operator cannot be used with a mask\n", (expr->expr.op == EXPR_NEGATE ? "-" : "!")); return false; default: - log_wsgo(ctx, "Unknown operator %d in ResolveMask\n", + log_wsgo_with_code(ctx, + XKB_ERROR_UNKNOWN_OPERATOR, + "Unknown operator %d in ResolveMask\n", expr->expr.op); break; } @@ -696,7 +754,8 @@ ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, xkb_atom_t name; if (def->expr.op != EXPR_IDENT) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Cannot resolve virtual modifier: " "found %s where a virtual modifier name was expected\n", expr_op_type_to_string(def->expr.op)); @@ -706,7 +765,8 @@ ExprResolveMod(struct xkb_context *ctx, const ExprDef *def, name = def->ident.ident; ndx = XkbModNameToIndex(mods, name, mod_type); if (ndx == XKB_MOD_INVALID) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER, "Cannot resolve virtual modifier: " "\"%s\" was not previously declared\n", xkb_atom_text(ctx, name)); diff --git a/src/xkbcomp/include.c b/src/xkbcomp/include.c index d39be89bd..fc692fb13 100644 --- a/src/xkbcomp/include.c +++ b/src/xkbcomp/include.c @@ -201,21 +201,31 @@ LogIncludePaths(struct xkb_context *ctx) unsigned int i; if (xkb_context_num_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths searched:\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "%d include paths searched:\n", xkb_context_num_include_paths(ctx)); for (i = 0; i < xkb_context_num_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "\t%s\n", xkb_context_include_path_get(ctx, i)); } else { - log_err(ctx, "There are no include paths to search\n"); + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "There are no include paths to search\n"); } if (xkb_context_num_failed_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths could not be added:\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "%d include paths could not be added:\n", xkb_context_num_failed_include_paths(ctx)); for (i = 0; i < xkb_context_num_failed_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "\t%s\n", xkb_context_failed_include_path_get(ctx, i)); } } @@ -246,7 +256,9 @@ FindFileInXkbPath(struct xkb_context *ctx, const char *name, buf = asprintf_safe("%s/%s/%s", xkb_context_include_path_get(ctx, i), typeDir, name); if (!buf) { - log_err(ctx, "Failed to alloc buffer for (%s/%s/%s)\n", + log_err_with_code(ctx, + XKB_ERROR_ALLOCATION_ERROR, + "Failed to alloc buffer for (%s/%s/%s)\n", xkb_context_include_path_get(ctx, i), typeDir, name); continue; } @@ -264,7 +276,9 @@ FindFileInXkbPath(struct xkb_context *ctx, const char *name, /* We only print warnings if we can't find the file on the first lookup */ if (*offset == 0) { - log_err(ctx, "Couldn't find file \"%s/%s\" in include paths\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "Couldn't find file \"%s/%s\" in include paths\n", typeDir, name); LogIncludePaths(ctx); } @@ -292,7 +306,8 @@ ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, if (xkb_file) { if (xkb_file->file_type != file_type) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, "Include file of wrong type (expected %s, got %s); " "Include file \"%s\" ignored\n", xkb_file_type_to_string(file_type), @@ -310,10 +325,14 @@ ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, if (!xkb_file) { if (stmt->map) - log_err(ctx, "Couldn't process include statement for '%s(%s)'\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, + "Couldn't process include statement for '%s(%s)'\n", stmt->file, stmt->map); else - log_err(ctx, "Couldn't process include statement for '%s'\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, + "Couldn't process include statement for '%s'\n", stmt->file); } diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index 35c84b768..41ddb2017 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -230,13 +230,15 @@ AddKeyName(KeyNamesInfo *info, xkb_keycode_t kc, xkb_atom_t name, if (merge == MERGE_OVERRIDE) { darray_item(info->key_names, old_kc) = XKB_ATOM_NONE; if (report) - log_warn(info->ctx, + log_warn_with_code(info->ctx, + XKB_WARNING_CONFLICTING_KEY_NAME, "Key name %s assigned to multiple keys; " "Using %d, ignoring %d\n", kname, kc, old_kc); } else { if (report) log_vrb(info->ctx, 3, + XKB_WARNING_CONFLICTING_KEY_NAME, "Key name %s assigned to multiple keys; " "Using %d, ignoring %d\n", kname, old_kc, kc); return true; @@ -397,6 +399,7 @@ HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge) if (old->alias == def->alias) { if (def->real == old->real) { log_vrb(info->ctx, 1, + XKB_WARNING_CONFLICTING_KEY_NAME, "Alias of %s for %s declared more than once; " "First definition ignored\n", KeyNameText(info->ctx, def->alias), @@ -408,7 +411,8 @@ HandleAliasDef(KeyNamesInfo *info, KeyAliasDef *def, enum merge_mode merge) use = (merge == MERGE_AUGMENT ? old->real : def->real); ignore = (merge == MERGE_AUGMENT ? def->real : old->real); - log_warn(info->ctx, + log_warn_with_code(info->ctx, + XKB_WARNING_CONFLICTING_KEY_NAME, "Multiple definitions for alias %s; " "Using %s, ignoring %s\n", KeyNameText(info->ctx, old->alias), @@ -573,6 +577,7 @@ CopyKeyAliasesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) /* Check that ->real is a key. */ if (!XkbKeyByName(keymap, alias->real, false)) { log_vrb(info->ctx, 5, + XKB_WARNING_UNDEFINED_KEYCODE, "Attempt to alias %s to non-existent key %s; Ignored\n", KeyNameText(info->ctx, alias->alias), KeyNameText(info->ctx, alias->real)); @@ -583,6 +588,7 @@ CopyKeyAliasesToKeymap(struct xkb_keymap *keymap, KeyNamesInfo *info) /* Check that ->alias is not a key. */ if (XkbKeyByName(keymap, alias->alias, false)) { log_vrb(info->ctx, 5, + XKB_WARNING_ILLEGAL_KEYCODE_ALIAS, "Attempt to create alias with the name of a real key; " "Alias \"%s = %s\" ignored\n", KeyNameText(info->ctx, alias->alias), diff --git a/src/xkbcomp/keymap.c b/src/xkbcomp/keymap.c index 0d1491333..087815927 100644 --- a/src/xkbcomp/keymap.c +++ b/src/xkbcomp/keymap.c @@ -245,6 +245,7 @@ CompileKeymap(XkbFile *file, struct xkb_keymap *keymap, enum merge_mode merge) file->file_type > LAST_KEYMAP_FILE_TYPE) { if (file->file_type == FILE_TYPE_GEOMETRY) { log_vrb(ctx, 1, + XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION, "Geometry sections are not supported; ignoring\n"); } else { log_err(ctx, "Cannot define %s in a keymap file\n", diff --git a/src/xkbcomp/parser.y b/src/xkbcomp/parser.y index e1226b1e4..0fd663ac7 100644 --- a/src/xkbcomp/parser.y +++ b/src/xkbcomp/parser.y @@ -856,6 +856,7 @@ parse(struct xkb_context *ctx, struct scanner *scanner, const char *map) if (first) log_vrb(ctx, 5, + XKB_WARNING_MISSING_DEFAULT_SECTION, "No map in include statement, but \"%s\" contains several; " "Using first defined map, \"%s\"\n", scanner->file_name, first->name); diff --git a/src/xkbcomp/symbols.c b/src/xkbcomp/symbols.c index e438139da..6d31c7c9f 100644 --- a/src/xkbcomp/symbols.c +++ b/src/xkbcomp/symbols.c @@ -62,9 +62,6 @@ #include "keysym.h" -// TODO: convert log_err to log_err_with_code -// TODO: convert log_vrb to log_vrb_with_code - enum key_repeat { KEY_REPEAT_UNDEFINED = 0, KEY_REPEAT_YES = 1, @@ -246,7 +243,7 @@ MergeGroups(SymbolsInfo *info, GroupInfo *into, GroupInfo *from, bool clobber, if (report) { log_warn_with_code(info->ctx, - XKB_WARNING_CONFLICTING_KEY_TYPE, + XKB_WARNING_CONFLICTING_KEY_TYPE_MERGING_GROUPS, "Multiple definitions for group %d type of key %s; " "Using %s, ignoring %s\n", group + 1, KeyNameText(info->ctx, key_name), @@ -592,7 +589,8 @@ HandleIncludeSymbols(SymbolsInfo *info, IncludeStmt *include) if (stmt->modifier) { next_incl.explicit_group = atoi(stmt->modifier) - 1; if (next_incl.explicit_group >= XKB_MAX_GROUPS) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNSUPPORTED_GROUP_INDEX, "Cannot set explicit group to %d - must be between 1..%d; " "Ignoring group number\n", next_incl.explicit_group + 1, XKB_MAX_GROUPS); @@ -640,7 +638,8 @@ GetGroupIndex(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, } if (i >= XKB_MAX_GROUPS) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNSUPPORTED_GROUP_INDEX, "Too many groups of %s for key %s (max %u); " "Ignoring %s defined for extra groups\n", name, KeyInfoText(info, keyi), XKB_MAX_GROUPS, name); @@ -686,7 +685,8 @@ AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, } if (value->expr.op != EXPR_KEYSYM_LIST) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Expected a list of symbols, found %s; " "Ignoring symbols for group %u of %s\n", expr_op_type_to_string(value->expr.op), ndx + 1, @@ -695,7 +695,8 @@ AddSymbolsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, } if (groupi->defined & GROUP_FIELD_SYMS) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_CONFLICTING_KEY_SYMBOLS_ENTRY, "Symbols for key %s, group %u already defined; " "Ignoring duplicate definition\n", KeyInfoText(info, keyi), ndx + 1); @@ -784,7 +785,8 @@ AddActionsToKey(SymbolsInfo *info, KeyInfo *keyi, ExprDef *arrayNdx, union xkb_action *toAct = &darray_item(groupi->levels, i).action; if (!HandleActionDef(info->ctx, info->actions, &info->mods, act, toAct)) - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_VALUE, "Illegal action definition for %s; " "Action for group %u/level %u ignored\n", KeyInfoText(info, keyi), ndx + 1, i + 1); @@ -815,7 +817,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, xkb_atom_t val; if (!ExprResolveString(info->ctx, value, &val)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "The type field of a key symbol map must be a string; " "Ignoring illegal type definition\n"); return false; @@ -853,7 +856,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, if (!ExprResolveModMask(info->ctx, value, MOD_VIRT, &info->mods, &mask)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNSUPPORTED_MODIFIER_MASK, "Expected a virtual modifier mask, found %s; " "Ignoring virtual modifiers definition for key %s\n", expr_op_type_to_string(value->expr.op), @@ -868,6 +872,7 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, istreq(field, "lock") || istreq(field, "locks")) { log_vrb(info->ctx, 1, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Key behaviors not supported; " "Ignoring locking specification for key %s\n", KeyInfoText(info, keyi)); @@ -876,6 +881,7 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, istreq(field, "permanentradiogroup") || istreq(field, "allownone")) { log_vrb(info->ctx, 1, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Radio groups not supported; " "Ignoring radio group specification for key %s\n", KeyInfoText(info, keyi)); @@ -883,6 +889,7 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, else if (istreq_prefix("overlay", field) || istreq_prefix("permanentoverlay", field)) { log_vrb(info->ctx, 1, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Overlays not supported; " "Ignoring overlay specification for key %s\n", KeyInfoText(info, keyi)); @@ -893,7 +900,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, unsigned int val; if (!ExprResolveEnum(info->ctx, value, &val, repeatEntries)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_VALUE, "Illegal repeat setting for %s; " "Non-boolean repeat setting ignored\n", KeyInfoText(info, keyi)); @@ -908,7 +916,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, bool set; if (!ExprResolveBoolean(info->ctx, value, &set)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_VALUE, "Illegal groupsWrap setting for %s; " "Non-boolean value ignored\n", KeyInfoText(info, keyi)); @@ -923,7 +932,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, bool set; if (!ExprResolveBoolean(info->ctx, value, &set)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_VALUE, "Illegal groupsClamp setting for %s; " "Non-boolean value ignored\n", KeyInfoText(info, keyi)); @@ -950,7 +960,8 @@ SetSymbolsField(SymbolsInfo *info, KeyInfo *keyi, const char *field, keyi->defined |= KEY_FIELD_GROUPINFO; } else { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNKNOWN_FIELD, "Unknown field %s in a symbol interpretation; " "Definition ignored\n", field); @@ -968,6 +979,7 @@ SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value) if (!arrayNdx) { log_vrb(info->ctx, 1, + XKB_WARNING_MISSING_SYMBOLS_GROUP_NAME_INDEX, "You must specify an index when specifying a group name; " "Group name definition without array subscript ignored\n"); return false; @@ -981,7 +993,8 @@ SetGroupName(SymbolsInfo *info, ExprDef *arrayNdx, ExprDef *value) } if (!ExprResolveString(info->ctx, value, &name)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Group name must be a string; " "Illegal name for group %d ignored\n", group); return false; @@ -1031,24 +1044,28 @@ HandleGlobalVar(SymbolsInfo *info, VarDef *stmt) } else if (!elem && (istreq(field, "groupswrap") || istreq(field, "wrapgroups"))) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Global \"groupswrap\" not supported; Ignored\n"); ret = true; } else if (!elem && (istreq(field, "groupsclamp") || istreq(field, "clampgroups"))) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Global \"groupsclamp\" not supported; Ignored\n"); ret = true; } else if (!elem && (istreq(field, "groupsredirect") || istreq(field, "redirectgroups"))) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Global \"groupsredirect\" not supported; Ignored\n"); ret = true; } else if (!elem && istreq(field, "allownone")) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Radio groups not supported; " "Ignoring \"allownone\" specification\n"); ret = true; @@ -1070,7 +1087,8 @@ HandleSymbolsBody(SymbolsInfo *info, VarDef *def, KeyInfo *keyi) for (; def; def = (VarDef *) def->common.next) { if (def->name && def->name->expr.op == EXPR_FIELD_REF) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_SCOPE, "Cannot set a global default value from within a key statement; " "Move statements to the global file scope\n"); continue; @@ -1180,7 +1198,8 @@ HandleModMapDef(SymbolsInfo *info, ModMapDef *def) // Handle normal entry ndx = XkbModNameToIndex(&info->mods, def->modifier, MOD_REAL); if (ndx == XKB_MOD_INVALID) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_REAL_MODIFIER, "Illegal modifier map definition; " "Ignoring map for non-modifier \"%s\"\n", xkb_atom_text(ctx, def->modifier)); @@ -1205,7 +1224,8 @@ HandleModMapDef(SymbolsInfo *info, ModMapDef *def) tmp.u.keySym = sym; } else { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_MODMAP_ENTRY, "Modmap entries may contain only key names or keysyms; " "Illegal definition for %s modifier ignored\n", ModIndexText(info->ctx, &info->mods, tmp.modifier)); @@ -1243,7 +1263,8 @@ HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge) ok = HandleModMapDef(info, (ModMapDef *) stmt); break; default: - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_STATEMENT_TYPE, "Symbols files may not include other types; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; @@ -1254,7 +1275,9 @@ HandleSymbolsFile(SymbolsInfo *info, XkbFile *file, enum merge_mode merge) info->errorCount++; if (info->errorCount > 10) { - log_err(info->ctx, "Abandoning symbols file \"%s\"\n", + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_SYNTAX, + "Abandoning symbols file \"%s\"\n", file->name); break; } @@ -1436,7 +1459,7 @@ CopySymbolsDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, */ key = XkbKeyByName(keymap, keyi->name, false); if (!key) { - log_vrb_with_code(info->ctx, 5, + log_vrb(info->ctx, 5, XKB_WARNING_UNDEFINED_KEYCODE, "Key %s not found in keycodes; Symbols ignored\n", KeyInfoText(info, keyi)); @@ -1480,7 +1503,7 @@ CopySymbolsDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, if (type->num_levels < darray_size(groupi->levels)) { struct xkb_level *leveli; - log_vrb_with_code(info->ctx, 1, + log_vrb(info->ctx, 1, XKB_WARNING_EXTRA_SYMBOLS_IGNORED, "Type \"%s\" has %d levels, but %s has %d levels; " "Ignoring extra symbols\n", @@ -1533,7 +1556,7 @@ CopyModMapDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, if (!entry->haveSymbol) { key = XkbKeyByName(keymap, entry->u.keyName, true); if (!key) { - log_vrb_with_code(info->ctx, 5, + log_vrb(info->ctx, 5, XKB_WARNING_UNDEFINED_KEYCODE, "Key %s not found in keycodes; " "Modifier map entry for %s not updated\n", @@ -1545,7 +1568,7 @@ CopyModMapDefToKeymap(struct xkb_keymap *keymap, SymbolsInfo *info, else { key = FindKeyForSymbol(keymap, entry->u.keySym); if (!key) { - log_vrb_with_code(info->ctx, 5, + log_vrb(info->ctx, 5, XKB_WARNING_UNRESOLVED_KEYMAP_SYMBOL, "Key \"%s\" not found in symbol map; " "Modifier map entry for %s not updated\n", diff --git a/src/xkbcomp/types.c b/src/xkbcomp/types.c index e8e82df44..fe089ae2d 100644 --- a/src/xkbcomp/types.c +++ b/src/xkbcomp/types.c @@ -143,7 +143,8 @@ AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new, bool same_file) if (old) { if (new->merge == MERGE_REPLACE || new->merge == MERGE_OVERRIDE) { if ((same_file && verbosity > 0) || verbosity > 9) { - log_warn(info->ctx, + log_warn_with_code(info->ctx, + XKB_WARNING_CONFLICTING_KEY_TYPE_DEFINITIONS, "Multiple definitions of the %s key type; " "Earlier definition ignored\n", xkb_atom_text(info->ctx, new->name)); @@ -158,6 +159,7 @@ AddKeyType(KeyTypesInfo *info, KeyTypeInfo *new, bool same_file) if (same_file) log_vrb(info->ctx, 4, + XKB_WARNING_CONFLICTING_KEY_TYPE_DEFINITIONS, "Multiple definitions of the %s key type; " "Later definition ignored\n", xkb_atom_text(info->ctx, new->name)); @@ -255,7 +257,8 @@ SetModifiers(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, "Illegal array subscript ignored\n"); if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &mods)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNSUPPORTED_MODIFIER_MASK, "Key type mask field must be a modifier mask; " "Key type definition ignored\n"); return false; @@ -298,7 +301,8 @@ AddMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, old = FindMatchingMapEntry(type, new->mods.mods); if (old) { if (report && old->level != new->level) { - log_warn(info->ctx, + log_warn_with_code(info->ctx, + XKB_WARNING_CONFLICTING_KEY_TYPE_MAP_ENTRY, "Multiple map entries for %s in %s; " "Using %d, ignoring %d\n", MapEntryTxt(info, new), TypeTxt(info, type), @@ -307,6 +311,7 @@ AddMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, } else { log_vrb(info->ctx, 10, + XKB_WARNING_CONFLICTING_KEY_TYPE_MAP_ENTRY, "Multiple occurrences of map[%s]= %d in %s; Ignored\n", MapEntryTxt(info, new), new->level + 1, TypeTxt(info, type)); @@ -345,7 +350,8 @@ SetMapEntry(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, if (entry.mods.mods & (~type->mods)) { log_vrb(info->ctx, 1, - "Map entry for unused modifiers in %s; " + XKB_WARNING_UNDECLARED_MODIFIERS_IN_KEY_TYPE, + "Map entry for modifiers not used by type %s; " "Using %s instead of %s\n", TypeTxt(info, type), ModMaskText(info->ctx, &info->mods, @@ -388,6 +394,7 @@ AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type, /* Map exists with same preserve; do nothing. */ if (entry->preserve.mods == preserve_mods) { log_vrb(info->ctx, 10, + XKB_WARNING_DUPLICATE_ENTRY, "Identical definitions for preserve[%s] in %s; " "Ignored\n", ModMaskText(info->ctx, &info->mods, mods), @@ -397,6 +404,7 @@ AddPreserve(KeyTypesInfo *info, KeyTypeInfo *type, /* Map exists with different preserve; latter wins. */ log_vrb(info->ctx, 1, + XKB_WARNING_CONFLICTING_KEY_TYPE_PRESERVE_ENTRIES, "Multiple definitions for preserve[%s] in %s; " "Using %s, ignoring %s\n", ModMaskText(info->ctx, &info->mods, mods), @@ -441,14 +449,16 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, after = ModMaskText(info->ctx, &info->mods, mods); log_vrb(info->ctx, 1, - "Preserve for modifiers not used by the %s type; " + XKB_WARNING_UNDECLARED_MODIFIERS_IN_KEY_TYPE, + "Preserve entry for modifiers not used by the %s type; " "Index %s converted to %s\n", TypeTxt(info, type), before, after); } if (!ExprResolveModMask(info->ctx, value, MOD_BOTH, &info->mods, &preserve_mods)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNSUPPORTED_MODIFIER_MASK, "Preserve value in a key type is not a modifier mask; " "Ignoring preserve[%s] in type %s\n", ModMaskText(info->ctx, &info->mods, mods), @@ -464,6 +474,7 @@ SetPreserve(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, after = ModMaskText(info->ctx, &info->mods, preserve_mods); log_vrb(info->ctx, 1, + XKB_WARNING_ILLEGAL_KEY_TYPE_PRESERVE_RESULT, "Illegal value for preserve[%s] in type %s; " "Converted %s to %s\n", ModMaskText(info->ctx, &info->mods, mods), @@ -488,6 +499,7 @@ AddLevelName(KeyTypesInfo *info, KeyTypeInfo *type, /* Same level, same name. */ if (darray_item(type->level_names, level) == name) { log_vrb(info->ctx, 10, + XKB_WARNING_DUPLICATE_ENTRY, "Duplicate names for level %d of key type %s; Ignored\n", level + 1, TypeTxt(info, type)); return true; @@ -500,6 +512,7 @@ AddLevelName(KeyTypesInfo *info, KeyTypeInfo *type, darray_item(type->level_names, level)); new = xkb_atom_text(info->ctx, name); log_vrb(info->ctx, 1, + XKB_WARNING_CONFLICTING_KEY_TYPE_LEVEL_NAMES, "Multiple names for level %d of key type %s; " "Using %s, ignoring %s\n", level + 1, TypeTxt(info, type), @@ -531,7 +544,8 @@ SetLevelName(KeyTypesInfo *info, KeyTypeInfo *type, ExprDef *arrayNdx, type, "level name", "integer"); if (!ExprResolveString(info->ctx, value, &level_name)) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "Non-string name for level %d in key type %s; " "Ignoring illegal level name definition\n", level + 1, xkb_atom_text(info->ctx, type->name)); @@ -566,7 +580,8 @@ SetKeyTypeField(KeyTypesInfo *info, KeyTypeInfo *type, type_field = TYPE_FIELD_LEVEL_NAME; ok = SetLevelName(info, type, arrayNdx, value); } else { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_UNKNOWN_FIELD, "Unknown field %s in key type %s; Definition ignored\n", field, TypeTxt(info, type)); } @@ -589,7 +604,8 @@ HandleKeyTypeBody(KeyTypesInfo *info, VarDef *def, KeyTypeInfo *type) continue; if (elem && istreq(elem, "type")) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_SET_DEFAULT_STATEMENT, "Support for changing the default type has been removed; " "Statement ignored\n"); continue; @@ -644,7 +660,8 @@ HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) ok = HandleKeyTypeDef(info, (KeyTypeDef *) stmt, merge); break; case STMT_VAR: - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_STATEMENT_TYPE, "Support for changing the default type has been removed; " "Statement ignored\n"); ok = true; @@ -653,7 +670,8 @@ HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) ok = HandleVModDef(info->ctx, &info->mods, (VModDef *) stmt, merge); break; default: - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_WRONG_STATEMENT_TYPE, "Key type files may not include other declarations; " "Ignoring %s\n", stmt_type_to_string(stmt->type)); ok = false; @@ -664,7 +682,8 @@ HandleKeyTypesFile(KeyTypesInfo *info, XkbFile *file, enum merge_mode merge) info->errorCount++; if (info->errorCount > 10) { - log_err(info->ctx, + log_err_with_code(info->ctx, + XKB_ERROR_INVALID_SYNTAX, "Abandoning keytypes file \"%s\"\n", file->name); break; } diff --git a/src/xkbcomp/xkbcomp-priv.h b/src/xkbcomp/xkbcomp-priv.h index 5a7765f43..50c07b56a 100644 --- a/src/xkbcomp/xkbcomp-priv.h +++ b/src/xkbcomp/xkbcomp-priv.h @@ -82,7 +82,8 @@ static inline bool ReportNotArray(struct xkb_context *ctx, const char *type, const char *field, const char *name) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_WRONG_FIELD_TYPE, "The %s %s field is not an array; " "Ignoring illegal assignment in %s\n", type, field, name); @@ -93,7 +94,8 @@ static inline bool ReportShouldBeArray(struct xkb_context *ctx, const char *type, const char *field, const char *name) { - log_err(ctx, + log_err_with_code(ctx, + XKB_ERROR_EXPECTED_ARRAY_ENTRY, "Missing subscript for %s %s; " "Ignoring illegal assignment in %s\n", type, field, name); diff --git a/test/log.c b/test/log.c index 384fabcb0..14e4845ff 100644 --- a/test/log.c +++ b/test/log.c @@ -25,6 +25,7 @@ #include "test.h" #include "context.h" +#include "messages-codes.h" #ifdef __GNUC__ #pragma GCC diagnostic ignored "-Wmissing-format-attribute" @@ -89,14 +90,14 @@ main(void) log_info(ctx, "first info\n"); log_dbg(ctx, "first debug: %s\n", "hello"); log_err(ctx, "first error: %lu\n", 115415UL); - log_vrb(ctx, 5, "first verbose 5\n"); + log_vrb(ctx, 5, XKB_LOG_MESSAGE_NO_ID, "first verbose 5\n"); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_DEBUG); log_warn(ctx, "second warning: %d\n", 87); log_dbg(ctx, "second debug: %s %s\n", "hello", "world"); log_info(ctx, "second info\n"); log_err(ctx, "second error: %lu\n", 115415UL); - log_vrb(ctx, 6, "second verbose 6\n"); + log_vrb(ctx, 6, XKB_LOG_MESSAGE_NO_ID, "second verbose 6\n"); xkb_context_set_log_verbosity(ctx, 0); xkb_context_set_log_level(ctx, XKB_LOG_LEVEL_CRITICAL); @@ -104,14 +105,14 @@ main(void) log_dbg(ctx, "third debug: %s %s\n", "hello", "world"); log_info(ctx, "third info\n"); log_err(ctx, "third error: %lu\n", 115415UL); - log_vrb(ctx, 0, "third verbose 0\n"); + log_vrb(ctx, 0, XKB_LOG_MESSAGE_NO_ID, "third verbose 0\n"); printf("%s", log_string.item); assert(streq(log_string.item, "warning: first warning: 87\n" "error: first error: 115415\n" - "warning: first verbose 5\n" + "warning: [XKB-000] first verbose 5\n" "warning: second warning: 87\n" "debug: second debug: hello world\n" "info: second info\n" diff --git a/tools/messages.c b/tools/messages.c index abda073a6..fc3b4117d 100644 --- a/tools/messages.c +++ b/tools/messages.c @@ -39,26 +39,57 @@ static const struct xkb_message_entry xkb_messages[] = { {XKB_ERROR_MALFORMED_NUMBER_LITERAL, "Malformed number literal"}, + {XKB_WARNING_CONFLICTING_KEY_TYPE_PRESERVE_ENTRIES, "Conflicting key type preserve entries"}, {XKB_ERROR_UNSUPPORTED_MODIFIER_MASK, "Unsupported modifier mask"}, + {XKB_ERROR_EXPECTED_ARRAY_ENTRY, "Expected array entry"}, + {XKB_WARNING_ILLEGAL_KEYCODE_ALIAS, "Illegal keycode alias"}, {XKB_WARNING_UNRECOGNIZED_KEYSYM, "Unrecognized keysym"}, + {XKB_ERROR_UNDECLARED_VIRTUAL_MODIFIER, "Undeclared virtual modifier"}, + {XKB_ERROR_WRONG_STATEMENT_TYPE, "Wrong statement type"}, + {XKB_WARNING_UNSUPPORTED_GEOMETRY_SECTION, "Unsupported geometry section"}, {XKB_WARNING_CANNOT_INFER_KEY_TYPE, "Cannot infer key type"}, + {XKB_WARNING_ILLEGAL_KEY_TYPE_PRESERVE_RESULT, "Illegal key type preserve result"}, + {XKB_ERROR_INVALID_INCLUDE_STATEMENT, "Invalid include statement"}, + {XKB_ERROR_INVALID_MODMAP_ENTRY, "Invalid modmap entry"}, {XKB_ERROR_UNSUPPORTED_GROUP_INDEX, "Unsupported group index"}, + {XKB_WARNING_CONFLICTING_KEY_TYPE_LEVEL_NAMES, "Conflicting key type level names"}, + {XKB_ERROR_INVALID_SET_DEFAULT_STATEMENT, "Invalid set default statement"}, + {XKB_WARNING_CONFLICTING_KEY_TYPE_MAP_ENTRY, "Conflicting key type map entry"}, {XKB_WARNING_UNDEFINED_KEY_TYPE, "Undefined key type"}, {XKB_WARNING_NON_BASE_GROUP_NAME, "Non base group name"}, {XKB_ERROR_UNSUPPORTED_SHIFT_LEVEL, "Unsupported shift level"}, + {XKB_ERROR_INCLUDED_FILE_NOT_FOUND, "Included file not found"}, + {XKB_ERROR_UNKNOWN_OPERATOR, "Unknown operator"}, + {XKB_WARNING_DUPLICATE_ENTRY, "Duplicate entry"}, + {XKB_WARNING_CONFLICTING_KEY_TYPE_DEFINITIONS, "Conflicting key type definitions"}, + {XKB_ERROR_WRONG_SCOPE, "Wrong scope"}, + {XKB_WARNING_MISSING_DEFAULT_SECTION, "Missing default section"}, {XKB_WARNING_CONFLICTING_KEY_SYMBOL, "Conflicting key symbol"}, + {XKB_ERROR_INVALID_OPERATION, "Invalid operation"}, {XKB_WARNING_NUMERIC_KEYSYM, "Numeric keysym"}, {XKB_WARNING_EXTRA_SYMBOLS_IGNORED, "Extra symbols ignored"}, + {XKB_WARNING_CONFLICTING_KEY_NAME, "Conflicting key name"}, + {XKB_ERROR_ALLOCATION_ERROR, "Allocation error"}, {XKB_ERROR_WRONG_FIELD_TYPE, "Wrong field type"}, + {XKB_ERROR_INVALID_REAL_MODIFIER, "Invalid real modifier"}, {XKB_WARNING_UNKNOWN_CHAR_ESCAPE_SEQUENCE, "Unknown char escape sequence"}, + {XKB_ERROR_INVALID_INCLUDED_FILE, "Invalid included file"}, {XKB_WARNING_MULTIPLE_GROUPS_AT_ONCE, "Multiple groups at once"}, + {XKB_WARNING_UNSUPPORTED_SYMBOLS_FIELD, "Unsupported symbols field"}, {XKB_ERROR_INVALID_SYNTAX, "Invalid syntax"}, {XKB_WARNING_UNDEFINED_KEYCODE, "Undefined keycode"}, + {XKB_ERROR_INVALID_EXPRESSION_TYPE, "Invalid expression type"}, + {XKB_ERROR_INVALID_VALUE, "Invalid value"}, {XKB_WARNING_CONFLICTING_MODMAP, "Conflicting modmap"}, + {XKB_ERROR_UNKNOWN_FIELD, "Unknown field"}, {XKB_WARNING_CONFLICTING_KEY_ACTION, "Conflicting key action"}, - {XKB_WARNING_CONFLICTING_KEY_TYPE, "Conflicting key type"}, + {XKB_WARNING_CONFLICTING_KEY_TYPE_MERGING_GROUPS, "Conflicting key type merging groups"}, + {XKB_ERROR_CONFLICTING_KEY_SYMBOLS_ENTRY, "Conflicting key symbols entry"}, + {XKB_WARNING_MISSING_SYMBOLS_GROUP_NAME_INDEX, "Missing symbols group name index"}, {XKB_WARNING_CONFLICTING_KEY_FIELDS, "Conflicting key fields"}, - {XKB_WARNING_UNRESOLVED_KEYMAP_SYMBOL, "Unresolved keymap symbol"} + {XKB_ERROR_INVALID_IDENTIFIER, "Invalid identifier"}, + {XKB_WARNING_UNRESOLVED_KEYMAP_SYMBOL, "Unresolved keymap symbol"}, + {XKB_WARNING_UNDECLARED_MODIFIERS_IN_KEY_TYPE, "Undeclared modifiers in key type"} }; int