lk_set_log_priority(kmap, LOG_ERR);
kmap->keymap = malloc(sizeof(struct lk_array));
+ kmap->accent_table = malloc(sizeof(struct lk_array));
kmap->key_constant = malloc(sizeof(struct lk_array));
kmap->key_line = malloc(sizeof(struct lk_array));
- if (!(kmap->keymap) || !(kmap->key_constant) || !(kmap->key_line)) {
+ if (!(kmap->keymap) || !(kmap->accent_table) || !(kmap->key_constant) || !(kmap->key_line)) {
ERR(kmap, "out of memory");
return -1;
}
lk_array_init(kmap->keymap, sizeof(void*), 0);
+ lk_array_init(kmap->accent_table, sizeof(void*), 0);
lk_array_init(kmap->key_constant, sizeof(char), 0);
lk_array_init(kmap->key_line, sizeof(int), 0);
kmap->keymap = NULL;
}
+ if (kmap->accent_table) {
+ for (i = 0; i < kmap->accent_table->total; i++) {
+ struct lk_array *ptr;
+
+ ptr = lk_array_get_ptr(kmap->accent_table, i);
+ if (!ptr)
+ continue;
+
+ free(ptr);
+ }
+ lk_array_free(kmap->accent_table);
+ free(kmap->accent_table);
+
+ kmap->accent_table = NULL;
+ }
+
if (kmap->key_constant) {
lk_array_free(kmap->key_constant);
free(kmap->key_constant);
unsigned int maxfunc;
unsigned int func_table_offs[MAX_NR_FUNC];
unsigned int func_buf_offset = 0;
+ struct kb_diacr *kddiac;
if (lk_add_constants(kmap) < 0)
return -1;
fprintf(fd, "\t0,\n");
fprintf(fd, "};\n");
-#ifdef KDSKBDIACRUC
if (kmap->flags & LK_FLAG_PREFER_UNICODE) {
fprintf(fd, "\nstruct kbdiacruc accent_table[MAX_DIACR] = {\n");
- for (i = 0; i < kmap->accent_table_size; i++) {
+ for (i = 0; i < kmap->accent_table->count; i++) {
+ kddiac = lk_array_get_ptr(kmap->accent_table, i);
+
fprintf(fd, "\t{");
- outchar(fd, kmap->accent_table[i].diacr, 1);
- outchar(fd, kmap->accent_table[i].base, 1);
- fprintf(fd, "0x%04x},", kmap->accent_table[i].result);
+ outchar(fd, kddiac->diacr, 1);
+ outchar(fd, kddiac->base, 1);
+ fprintf(fd, "0x%04x},", kddiac->result);
if (i % 2)
fprintf(fd, "\n");
}
if (i % 2)
fprintf(fd, "\n");
fprintf(fd, "};\n\n");
- } else
-#endif
- {
+ } else {
fprintf(fd, "\nstruct kbdiacr accent_table[MAX_DIACR] = {\n");
- for (i = 0; i < kmap->accent_table_size; i++) {
+ for (i = 0; i < kmap->accent_table->count; i++) {
+ kddiac = lk_array_get_ptr(kmap->accent_table, i);
+
fprintf(fd, "\t{");
- outchar(fd, kmap->accent_table[i].diacr, 1);
- outchar(fd, kmap->accent_table[i].base, 1);
- outchar(fd, kmap->accent_table[i].result, 0);
+ outchar(fd, kddiac->diacr, 1);
+ outchar(fd, kddiac->base, 1);
+ outchar(fd, kddiac->result, 0);
fprintf(fd, "},");
if (i % 2)
fprintf(fd, "\n");
fprintf(fd, "\n");
fprintf(fd, "};\n\n");
}
- fprintf(fd, "unsigned int accent_table_size = %d;\n", kmap->accent_table_size);
+ fprintf(fd, "unsigned int accent_table_size = %u;\n",
+ (unsigned int) kmap->accent_table->count);
return 0;
}
lk_dump_diacs(struct keymap *kmap, FILE *fd)
{
unsigned int i;
-#ifdef KDSKBDIACRUC
- if (kmap->flags & LK_FLAG_PREFER_UNICODE) {
- for (i = 0; i < kmap->accent_table_size; i++) {
- fprintf(fd, "compose ");
- dumpchar(fd, kmap->accent_table[i].diacr & 0xff, 0);
+ struct kb_diacr *ptr;
+
+ for (i = 0; i < kmap->accent_table->count; i++) {
+ ptr = lk_array_get_ptr(kmap->accent_table, i);
+ if (!ptr)
+ continue;
+
+ fprintf(fd, "compose ");
+
+ if (kmap->flags & LK_FLAG_PREFER_UNICODE) {
+ dumpchar(fd, ptr->diacr & 0xff, 0);
fprintf(fd, " ");
- dumpchar(fd, kmap->accent_table[i].base & 0xff, 0);
- fprintf(fd, " to U+%04x\n", kmap->accent_table[i].result);
- }
- } else
-#endif
- {
- for (i = 0; i < kmap->accent_table_size; i++) {
- fprintf(fd, "compose ");
- dumpchar(fd, kmap->accent_table[i].diacr, 0);
+ dumpchar(fd, ptr->base & 0xff, 0);
+ fprintf(fd, " to U+%04x\n", ptr->result);
+ } else {
+ dumpchar(fd, ptr->diacr, 0);
fprintf(fd, " ");
- dumpchar(fd, kmap->accent_table[i].base, 0);
+ dumpchar(fd, ptr->base, 0);
fprintf(fd, " to ");
- dumpchar(fd, kmap->accent_table[i].result, 0);
+ dumpchar(fd, ptr->result, 0);
fprintf(fd, "\n");
}
}
#include <keymap/findfile.h>
#include <keymap/array.h>
-#ifdef KDSKBDIACRUC
-typedef struct kbdiacruc accent_entry;
-#else
-typedef struct kbdiacr accent_entry;
-#endif
+struct kb_diacr {
+ unsigned int diacr, base, result;
+};
typedef enum {
LK_FLAG_UNICODE_MODE = (1 << 1),
/* the kernel structures we want to set or print */
char *func_table[MAX_NR_FUNC];
- accent_entry accent_table[MAX_DIACR];
- unsigned int accent_table_size;
+ struct lk_array *accent_table;
struct lk_array *key_constant;
int
lk_add_diacr(struct keymap *kmap, unsigned int diacr, unsigned int base, unsigned int res)
{
- accent_entry *ptr;
+ struct kb_diacr *ptr;
- if (kmap->accent_table_size == MAX_DIACR) {
- ERR(kmap, _("table overflow"));
+ ptr = malloc(sizeof(struct kb_diacr));
+ if (!ptr) {
+ ERR(kmap, _("out of memory"));
return -1;
}
- ptr = &(kmap->accent_table[kmap->accent_table_size++]);
ptr->diacr = diacr;
ptr->base = base;
ptr->result = res;
+ lk_array_append(kmap->accent_table, &ptr);
+
return 0;
}
defdiacs(struct keymap *kmap, int fd)
{
unsigned int i, count;
- struct kbdiacrs kd;
-#ifdef KDSKBDIACRUC
- struct kbdiacrsuc kdu;
-#endif
+ struct kb_diacr *ptr;
- count = kmap->accent_table_size;
+ count = kmap->accent_table->count;
if (count > MAX_DIACR) {
count = MAX_DIACR;
ERR(kmap, _("too many compose definitions"));
}
#ifdef KDSKBDIACRUC
if (kmap->flags & LK_FLAG_PREFER_UNICODE) {
+ struct kbdiacrsuc kdu;
+
kdu.kb_cnt = count;
for (i = 0; i < kdu.kb_cnt; i++) {
- kdu.kbdiacruc[i].diacr = kmap->accent_table[i].diacr;
- kdu.kbdiacruc[i].base = kmap->accent_table[i].base;
- kdu.kbdiacruc[i].result = kmap->accent_table[i].result;
+ ptr = lk_array_get_ptr(kmap->accent_table, i);
+ if (!ptr) {
+ /* It can't be happen */
+ ERR(kmap, _("unable to get compose definitions"));
+ return -1;
+ }
+
+ kdu.kbdiacruc[i].diacr = ptr->diacr;
+ kdu.kbdiacruc[i].base = ptr->base;
+ kdu.kbdiacruc[i].result = ptr->result;
}
- if (ioctl(fd, KDSKBDIACRUC, (unsigned long)&kdu))
- goto fail2;
+ if (ioctl(fd, KDSKBDIACRUC, (unsigned long)&kdu)) {
+ ERR(kmap, "KDSKBDIACRUC: %s", strerror(errno));
+ return -1;
+ }
} else
#endif
{
+ struct kbdiacrs kd;
+
kd.kb_cnt = count;
+
for (i = 0; i < kd.kb_cnt; i++) {
- kd.kbdiacr[i].diacr = kmap->accent_table[i].diacr;
- kd.kbdiacr[i].base = kmap->accent_table[i].base;
- kd.kbdiacr[i].result = kmap->accent_table[i].result;
+ ptr = lk_array_get_ptr(kmap->accent_table, i);
+ if (!ptr) {
+ ERR(kmap, _("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 (ioctl(fd, KDSKBDIACR, (unsigned long)&kd))
- goto fail1;
+ if (ioctl(fd, KDSKBDIACR, (unsigned long)&kd)) {
+ ERR(kmap, "KDSKBDIACR: %s", strerror(errno));
+ return -1;
+ }
}
return count;
-
- fail1: ERR(kmap, "KDSKBDIACR: %s", strerror(errno));
- return -1;
-
-#ifdef KDSKBDIACRUC
- fail2: ERR(kmap, "KDSKBDIACRUC: %s", strerror(errno));
- return -1;
-#endif
}
int
keyct, (keyct == 1) ? _("key") : _("keys"),
funcct, (funcct == 1) ? _("string") : _("strings"));
- if (kmap->accent_table_size > 0 || kmap->flags & LK_FLAG_CLEAR_COMPOSE) {
+ if (kmap->accent_table->count > 0 || kmap->flags & LK_FLAG_CLEAR_COMPOSE) {
diacct = defdiacs(kmap, fd);
if (diacct < 0)
MAX_NR_FUNC);
fprintf(fd, _("max nr of compose definitions: %d\n"),
MAX_DIACR);
- fprintf(fd, _("nr of compose definitions in actual use: %d\n"),
- kmap->accent_table_size);
+ fprintf(fd, _("nr of compose definitions in actual use: %u\n"),
+ (unsigned int) kmap->accent_table->count);
}
void
START_TEST(test_add_diacr_0)
{
- int i = MAX_DIACR;
+ int i = MAX_DIACR + 10;
struct keymap kmap;
lk_init(&kmap);
kmap.log_fn = NULL;
i--;
}
- fail_if(lk_add_diacr(&kmap, 0, 0, 0) == 0,
- "Possible to add diacr (MAX_DIACR)");
-
lk_free(&kmap);
}
END_TEST