LKFLAG_CLEAR_STRINGS = (1 << 3),
} lkflags;
+typedef enum {
+ LK_KEYWORD_KEYMAPS = (1 << 1),
+ LK_KEYWORD_ALTISMETA = (1 << 2),
+ LK_KEYWORD_CHARSET = (1 << 3),
+ LK_KEYWORD_STRASUSUAL = (1 << 4)
+} lk_keywords;
+
#define MAX_INCLUDE_DEPTH 20
struct keymap {
/* Parser flags */
lkflags flags;
+ /* Keymap keywords (keymaps, alt-is-meta, charset, ...) */
+ lk_keywords keywords;
+
/* What keymaps are we defining? */
u_short defining[MAX_NR_KEYMAPS];
int max_keymap; /* from here on, defining[] is false */
char key_is_constant[NR_KEYS];
char *keymap_was_set[MAX_NR_KEYMAPS];
- char keymaps_line_seen; /* Keyword: "keymaps" */
- int alt_is_meta; /* Keyword: "alt-is-meta" */
int mod; /* Line by line modifiers */
int key_buf[MAX_NR_KEYMAPS]; /* Key definitions on one line */
return 0;
if (!kmap->defining[k_table]) {
- if (kmap->keymaps_line_seen) {
+ if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
ERR(kmap, _("adding map %d violates explicit keymaps line"),
k_table);
return -1;
(kmap->keymap_was_set[k_table])[i] = 0;
}
- if (kmap->alt_is_meta && keycode == K_HOLE
+ if ((kmap->keywords & LK_KEYWORD_ALTISMETA) &&
+ keycode == K_HOLE
&& (kmap->keymap_was_set[k_table])[k_index])
return 0;
(kmap->key_map[k_table])[k_index] = keycode;
(kmap->keymap_was_set[k_table])[k_index] = 1;
- if (kmap->alt_is_meta) {
+ if (kmap->keywords & LK_KEYWORD_ALTISMETA) {
int alttable = k_table | M_ALT;
int type = KTYP(keycode);
int val = KVAL(keycode);
{
int i, r0 = 0;
- if (kmap->keymaps_line_seen) {
+ if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
while (r0 < kmap->max_keymap && !kmap->defining[r0])
r0++;
}
j, lk_get_key(kmap, i, j));
}
- } else if (kmap->keymaps_line_seen && !kmap->defining[i]) {
+ } else if ((kmap->keywords & LK_KEYWORD_KEYMAPS) &&
+ !kmap->defining[i]) {
/* deallocate keymap */
ke.kb_index = 0;
ke.kb_table = i;
(char *) $2.data);
YYERROR;
}
+ kmap->keywords |= LK_KEYWORD_CHARSET;
/* Unicode: The first 256 code points were made
identical to the content of ISO 8859-1 */
;
altismetaline : ALT_IS_META EOL
{
- kmap->alt_is_meta = 1;
+ kmap->keywords |= LK_KEYWORD_ALTISMETA;
}
;
usualstringsline: STRINGS AS USUAL EOL
{
if (strings_as_usual(kmap) == -1)
YYERROR;
+ kmap->keywords |= LK_KEYWORD_STRASUSUAL;
}
;
usualcomposeline: COMPOSE AS USUAL FOR STRLITERAL EOL
;
keymapline : KEYMAPS range EOL
{
- kmap->keymaps_line_seen = 1;
+ kmap->keywords |= LK_KEYWORD_KEYMAPS;
}
;
range : range COMMA range0
}
}
- if (kmap->keymaps_line_seen) {
+ if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
i = 0;
for (j = 0; j < kmap->max_keymap; j++) {