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 \
--- /dev/null
+#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);
+}
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;
}
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);
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)
{
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;
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)) {
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)) {
ptr.base = c.c2;
ptr.result = c.c3;
- if (lk_add_compose(ctx, &ptr) == -1)
+ if (lk_append_compose(ctx, &ptr) == -1)
return -1;
}
}
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
ptr.base = $3;
ptr.result = $5;
- if (lk_add_compose(ctx, &ptr) == -1)
+ if (lk_append_compose(ctx, &ptr) == -1)
YYERROR;
}
;
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--;
}