Replace variables for keywords with flags
authorAlexey Gladkov <gladkov.alexey@gmail.com>
Mon, 29 Apr 2013 12:24:55 +0000 (16:24 +0400)
committerAlexey Gladkov <gladkov.alexey@gmail.com>
Mon, 29 Apr 2013 12:24:55 +0000 (16:24 +0400)
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
src/libkeymap/keymap/data.h
src/libkeymap/kmap.c
src/libkeymap/loadkeys.c
src/libkeymap/parser.y

index 37ee356..10f29e3 100644 (file)
@@ -17,12 +17,22 @@ typedef enum {
        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 */
@@ -37,8 +47,6 @@ struct keymap {
        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 */
 
index 3c25fcd..f42a5d6 100644 (file)
@@ -97,7 +97,7 @@ lk_add_key(struct keymap *kmap, int k_table, int k_index, int keycode)
                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;
@@ -131,14 +131,15 @@ lk_add_key(struct keymap *kmap, int k_table, int k_index, int keycode)
                        (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);
@@ -297,7 +298,7 @@ lk_add_constants(struct keymap *kmap)
 {
        int i, r0 = 0;
 
-       if (kmap->keymaps_line_seen) {
+       if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
                while (r0 < kmap->max_keymap && !kmap->defining[r0])
                        r0++;
        }
index a3d676e..88404dc 100644 (file)
@@ -57,7 +57,8 @@ defkeys(struct keymap *kmap, int fd, int kbd_mode)
                                             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;
index 44b823a..0291bf8 100644 (file)
@@ -192,6 +192,7 @@ charsetline : CHARSET STRLITERAL EOL
                                                (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 */
@@ -202,13 +203,14 @@ charsetline       : CHARSET STRLITERAL EOL
                ;
 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
@@ -224,7 +226,7 @@ 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
@@ -327,7 +329,7 @@ fullline    : KEYCODE NUMBER EQUALS rvalue0 EOL
                                        }
                                }
 
-                               if (kmap->keymaps_line_seen) {
+                               if (kmap->keywords & LK_KEYWORD_KEYMAPS) {
                                        i = 0;
 
                                        for (j = 0; j < kmap->max_keymap; j++) {