Change the API for working with the diacritical table
authorAlexey Gladkov <gladkov.alexey@gmail.com>
Wed, 25 Jun 2014 20:48:47 +0000 (00:48 +0400)
committerAlexey Gladkov <gladkov.alexey@gmail.com>
Wed, 25 Jun 2014 20:48:47 +0000 (00:48 +0400)
Signed-off-by: Alexey Gladkov <gladkov.alexey@gmail.com>
src/libkeymap/Makefile.am
src/libkeymap/diacr.c [new file with mode: 0644]
src/libkeymap/kernel.c
src/libkeymap/keymap/kmap.h
src/libkeymap/kmap.c
src/libkeymap/loadkeys.c
src/libkeymap/parser.y
tests/libkeymap-keys.c

index 037dade..1cdc259 100644 (file)
@@ -40,7 +40,7 @@ ksyms_headers = \
 libkeymap_la_SOURCES = \
        $(headers) \
        array.c \
-       findfile.c common.c kernel.c dump.c kmap.c summary.c loadkeys.c \
+       findfile.c common.c kernel.c dump.c kmap.c diacr.c summary.c loadkeys.c \
        contextP.h \
        parser.y parser.h analyze.l analyze.h \
        modifiers.c modifiers.h \
diff --git a/src/libkeymap/diacr.c b/src/libkeymap/diacr.c
new file mode 100644 (file)
index 0000000..122c3f0
--- /dev/null
@@ -0,0 +1,98 @@
+#include <stdlib.h>
+#include <string.h>
+
+#include "nls.h"
+#include "kbd.h"
+
+#include "keymap.h"
+
+#include "contextP.h"
+#include "ksyms.h"
+
+int
+lk_get_diacr(struct lk_ctx *ctx, unsigned int index, struct lk_kbdiacr *dcr)
+{
+       struct lk_kbdiacr *ptr;
+
+       ptr = lk_array_get_ptr(ctx->accent_table, index);
+       if (!ptr) {
+               ERR(ctx, _("Index %d in the accent table does not exist"), index);
+               return -1;
+       }
+
+       dcr->diacr  = ptr->diacr;
+       dcr->base   = ptr->base;
+       dcr->result = ptr->result;
+
+       return 0;
+}
+
+int
+lk_append_diacr(struct lk_ctx *ctx, struct lk_kbdiacr *dcr)
+{
+       struct lk_kbdiacr *ptr;
+
+       ptr = malloc(sizeof(struct lk_kbdiacr));
+       if (!ptr) {
+               ERR(ctx, _("out of memory"));
+               return -1;
+       }
+
+       ptr->diacr  = dcr->diacr;
+       ptr->base   = dcr->base;
+       ptr->result = dcr->result;
+
+       lk_array_append(ctx->accent_table, &ptr);
+
+       return 0;
+}
+
+int
+lk_add_diacr(struct lk_ctx *ctx, unsigned int index, struct lk_kbdiacr *dcr)
+{
+       struct lk_kbdiacr *ptr;
+
+       ptr = malloc(sizeof(struct lk_kbdiacr));
+       if (!ptr) {
+               ERR(ctx, _("out of memory"));
+               return -1;
+       }
+
+       ptr->diacr  = dcr->diacr;
+       ptr->base   = dcr->base;
+       ptr->result = dcr->result;
+
+       lk_array_set(ctx->accent_table, index, &ptr);
+
+       return 0;
+}
+
+int
+lk_del_diacr(struct lk_ctx *ctx, unsigned int index)
+{
+       int rc;
+       rc = lk_array_unset(ctx->accent_table, index);
+       if (rc) {
+               ERR(ctx, _("Unable to remove item from the diacritical table"));
+               return -1;
+       }
+       return 0;
+}
+
+int
+lk_append_compose(struct lk_ctx *ctx, struct lk_kbdiacr *dcr)
+{
+       struct lk_kbdiacr dcr0;
+       int direction = TO_8BIT;
+
+#ifdef KDSKBDIACRUC
+       if (ctx->flags & LK_FLAG_PREFER_UNICODE)
+               direction = TO_UNICODE;
+#endif
+
+       dcr0.diacr  = convert_code(ctx, dcr->diacr,  direction);
+       dcr0.base   = convert_code(ctx, dcr->base,   direction);
+       dcr0.result = convert_code(ctx, dcr->result, direction);
+
+       return lk_append_diacr(ctx, &dcr0);
+}
index 2db7d42..7b80b10 100644 (file)
@@ -95,7 +95,7 @@ lk_kernel_diacrs(struct lk_ctx *ctx, int fd)
                dcr.base   = (ar+i)->base;
                dcr.result = (ar+i)->result;
 
-               if (lk_add_diacr(ctx, &dcr) < 0)
+               if (lk_add_diacr(ctx, i, &dcr) < 0)
                        return -1;
        }
 
index d6fa969..264efc6 100644 (file)
@@ -21,9 +21,12 @@ int lk_key_exists(struct lk_ctx *ctx,   unsigned int k_table, unsigned int k_ind
 int lk_get_func(struct lk_ctx *ctx, struct kbsentry *kbs);
 int lk_add_func(struct lk_ctx *ctx, struct kbsentry kbs);
 
+/* Functions for manipulations with diacritical table */
 int lk_get_diacr(struct lk_ctx *ctx, unsigned int index, struct lk_kbdiacr *dcr);
-int lk_add_diacr(struct lk_ctx *ctx, struct lk_kbdiacr *dcr);
-int lk_add_compose(struct lk_ctx *ctx, struct lk_kbdiacr *dcr);
+int lk_add_diacr(struct lk_ctx *ctx, unsigned int index, struct lk_kbdiacr *dcr);
+int lk_del_diacr(struct lk_ctx *ctx, unsigned int index);
+int lk_append_diacr(struct lk_ctx *ctx, struct lk_kbdiacr *dcr);
+int lk_append_compose(struct lk_ctx *ctx, struct lk_kbdiacr *dcr);
 
 int lk_add_constants(struct lk_ctx *ctx);
 
index 531e6ba..3b2c756 100644 (file)
@@ -210,62 +210,6 @@ lk_add_func(struct lk_ctx *ctx, struct kbsentry kbs)
        return 0;
 }
 
-int
-lk_get_diacr(struct lk_ctx *ctx, unsigned int index, struct lk_kbdiacr *dcr)
-{
-       struct lk_kbdiacr *ptr;
-
-       ptr = lk_array_get_ptr(ctx->accent_table, index);
-       if (!ptr) {
-               ERR(ctx, _("Index %d in the accent table does not exist"), index);
-               return -1;
-       }
-
-       dcr->diacr  = ptr->diacr;
-       dcr->base   = ptr->base;
-       dcr->result = ptr->result;
-
-       return 0;
-}
-
-int
-lk_add_diacr(struct lk_ctx *ctx, struct lk_kbdiacr *dcr)
-{
-       struct lk_kbdiacr *ptr;
-
-       ptr = malloc(sizeof(struct lk_kbdiacr));
-       if (!ptr) {
-               ERR(ctx, _("out of memory"));
-               return -1;
-       }
-
-       ptr->diacr  = dcr->diacr;
-       ptr->base   = dcr->base;
-       ptr->result = dcr->result;
-
-       lk_array_append(ctx->accent_table, &ptr);
-
-       return 0;
-}
-
-int
-lk_add_compose(struct lk_ctx *ctx, struct lk_kbdiacr *dcr)
-{
-       struct lk_kbdiacr dcr0;
-       int direction = TO_8BIT;
-
-#ifdef KDSKBDIACRUC
-       if (ctx->flags & LK_FLAG_PREFER_UNICODE)
-               direction = TO_UNICODE;
-#endif
-
-       dcr0.diacr  = convert_code(ctx, dcr->diacr,  direction);
-       dcr0.base   = convert_code(ctx, dcr->base,   direction);
-       dcr0.result = convert_code(ctx, dcr->result, direction);
-
-       return lk_add_diacr(ctx, &dcr0);
-}
-
 static int
 do_constant_key(struct lk_ctx *ctx, int i, u_short key)
 {
index 24579cc..fab92d1 100644 (file)
@@ -181,7 +181,7 @@ deffuncs(struct lk_ctx *ctx, int fd)
 static int
 defdiacs(struct lk_ctx *ctx, int fd)
 {
-       unsigned int i, count;
+       unsigned int i, j, count;
        struct lk_kbdiacr *ptr;
 
        count = ctx->accent_table->count;
@@ -195,17 +195,15 @@ defdiacs(struct lk_ctx *ctx, int fd)
 
                kdu.kb_cnt = count;
 
-               for (i = 0; i < kdu.kb_cnt; i++) {
+               for (i = 0, j = 0; i < ctx->accent_table->total && j < count; i++) {
                        ptr = lk_array_get_ptr(ctx->accent_table, i);
-                       if (!ptr) {
-                               /* It can't be happen */
-                               ERR(ctx, _("unable to get compose definitions"));
-                               return -1;
-                       }
+                       if (!ptr)
+                               continue;
 
-                       kdu.kbdiacruc[i].diacr  = ptr->diacr;
-                       kdu.kbdiacruc[i].base   = ptr->base;
-                       kdu.kbdiacruc[i].result = ptr->result;
+                       kdu.kbdiacruc[j].diacr  = ptr->diacr;
+                       kdu.kbdiacruc[j].base   = ptr->base;
+                       kdu.kbdiacruc[j].result = ptr->result;
+                       j++;
                }
 
                if (ioctl(fd, KDSKBDIACRUC, (unsigned long)&kdu)) {
@@ -219,15 +217,15 @@ defdiacs(struct lk_ctx *ctx, int fd)
 
                kd.kb_cnt = count;
 
-               for (i = 0; i < kd.kb_cnt; i++) {
+               for (i = 0, j = 0; i < ctx->accent_table->total && j < count; i++) {
                        ptr = lk_array_get_ptr(ctx->accent_table, i);
-                       if (!ptr) {
-                               ERR(ctx, _("unable to get compose definitions"));
-                               return -1;
-                       }
-                       kd.kbdiacr[i].diacr  = ptr->diacr;
-                       kd.kbdiacr[i].base   = ptr->base;
-                       kd.kbdiacr[i].result = ptr->result;
+                       if (!ptr)
+                               continue;
+
+                       kd.kbdiacr[j].diacr  = ptr->diacr;
+                       kd.kbdiacr[j].base   = ptr->base;
+                       kd.kbdiacr[j].result = ptr->result;
+                       j++;
                }
 
                if (ioctl(fd, KDSKBDIACR, (unsigned long)&kd)) {
index a936215..1169ced 100644 (file)
@@ -167,7 +167,7 @@ compose_as_usual(struct lk_ctx *ctx, char *charset)
                        ptr.base   = c.c2;
                        ptr.result = c.c3;
 
-                       if (lk_add_compose(ctx, &ptr) == -1)
+                       if (lk_append_compose(ctx, &ptr) == -1)
                                return -1;
                }
        }
@@ -279,7 +279,7 @@ compline        : COMPOSE compsym compsym TO compsym EOL
                                ptr.base   = $3;
                                ptr.result = $5;
 
-                               if (lk_add_compose(ctx, &ptr) == -1)
+                               if (lk_append_compose(ctx, &ptr) == -1)
                                        YYERROR;
                        }
                 | COMPOSE compsym compsym TO rvalue EOL
@@ -289,7 +289,7 @@ compline        : COMPOSE compsym compsym TO compsym EOL
                                ptr.base   = $3;
                                ptr.result = $5;
 
-                               if (lk_add_compose(ctx, &ptr) == -1)
+                               if (lk_append_compose(ctx, &ptr) == -1)
                                        YYERROR;
                        }
                 ;
index d42932e..c3b1477 100644 (file)
@@ -112,7 +112,7 @@ START_TEST(test_add_diacr_0)
        lk_set_log_fn(ctx, NULL, NULL);
 
        while (i > 0) {
-               fail_if(lk_add_diacr(ctx, &ptr) != 0,
+               fail_if(lk_append_diacr(ctx, &ptr) != 0,
                        "Unable to add diacr");
                i--;
        }