13 lk_log(struct lk_ctx *ctx, int priority,
14 const char *file, int line, const char *fn,
18 if (ctx->log_fn == NULL)
21 ctx->log_fn(ctx->log_data, priority, file, line, fn, fmt, args);
26 #define log_unused __attribute__((unused))
31 static void __attribute__((format(printf, 6, 0)))
33 int priority log_unused,
34 const char *file log_unused,
35 const int line log_unused,
36 const char *fn log_unused,
37 const char *format, va_list args)
46 priname = "EMERGENCY";
70 snprintf(buf, sizeof(buf), "L:%d", priority);
73 fprintf(fp, "libkeymap: %s %s:%d %s: ", priname, file, line, fn);
75 vfprintf(fp, format, args);
81 int lk_set_log_fn(struct lk_ctx *ctx, lk_logger_t log_fn, const void *data)
87 ctx->log_data = (void *)data;
92 int lk_get_log_priority(struct lk_ctx *ctx)
97 return ctx->log_priority;
100 int lk_set_log_priority(struct lk_ctx *ctx, int priority)
105 ctx->log_priority = priority;
110 lk_get_parser_flags(struct lk_ctx *ctx)
118 int lk_set_parser_flags(struct lk_ctx *ctx, lk_flags flags)
128 init_array(struct lk_ctx *ctx, struct lk_array **arr, ssize_t size)
133 ptr = malloc(sizeof(struct lk_array));
135 ERR(ctx, _("out of memory"));
139 rc = lk_array_init(ptr, size, 0);
141 ERR(ctx, _("unable to initialize array: %s"), strerror(rc));
155 ctx = malloc(sizeof(struct lk_ctx));
159 memset(ctx, 0, sizeof(struct lk_ctx));
161 lk_set_log_fn(ctx, log_file, stderr);
162 lk_set_log_priority(ctx, LOG_ERR);
164 if (init_array(ctx, &ctx->keymap, sizeof(void *)) < 0 ||
165 init_array(ctx, &ctx->func_table, sizeof(void *)) < 0 ||
166 init_array(ctx, &ctx->accent_table, sizeof(void *)) < 0 ||
167 init_array(ctx, &ctx->key_constant, sizeof(char)) < 0 ||
168 init_array(ctx, &ctx->key_line, sizeof(int)) < 0) {
173 ctx->kbdfile_ctx = kbdfile_context_new();
175 if (ctx->kbdfile_ctx == NULL) {
183 int lk_free(struct lk_ctx *ctx)
185 unsigned int i; //, j;
191 for (i = 0; i < ctx->keymap->total; i++) {
192 struct lk_array *map;
194 map = lk_array_get_ptr(ctx->keymap, i);
201 lk_array_free(ctx->keymap);
207 if (ctx->func_table) {
208 for (i = 0; i < ctx->func_table->total; i++) {
211 ptr = lk_array_get_ptr(ctx->func_table, i);
217 lk_array_free(ctx->func_table);
218 free(ctx->func_table);
220 ctx->func_table = NULL;
223 if (ctx->accent_table) {
224 for (i = 0; i < ctx->accent_table->total; i++) {
225 struct lk_array *ptr;
227 ptr = lk_array_get_ptr(ctx->accent_table, i);
233 lk_array_free(ctx->accent_table);
234 free(ctx->accent_table);
236 ctx->accent_table = NULL;
239 if (ctx->key_constant) {
240 lk_array_free(ctx->key_constant);
241 free(ctx->key_constant);
242 ctx->key_constant = NULL;
246 lk_array_free(ctx->key_line);
248 ctx->key_line = NULL;
251 if (ctx->kbdfile_ctx != NULL)
252 ctx->kbdfile_ctx = kbdfile_context_free(ctx->kbdfile_ctx);