diff options
Diffstat (limited to 'src/xkbcomp')
-rw-r--r-- | src/xkbcomp/rules.c | 30 |
1 files changed, 15 insertions, 15 deletions
diff --git a/src/xkbcomp/rules.c b/src/xkbcomp/rules.c index a08e3c5..5a2e1da 100644 --- a/src/xkbcomp/rules.c +++ b/src/xkbcomp/rules.c @@ -349,6 +349,7 @@ static bool read_rules_file(struct xkb_context *ctx, struct matcher *matcher, unsigned include_depth, + FILE *file, const char *path); static void @@ -356,8 +357,8 @@ matcher_include(struct matcher *m, struct scanner *parent_scanner, unsigned include_depth, struct sval inc) { - bool ret; struct scanner s; /* parses the !include value */ + FILE *file; scanner_init(&s, m->ctx, inc.start, inc.len, parent_scanner->file_name, NULL); @@ -408,9 +409,15 @@ matcher_include(struct matcher *m, struct scanner *parent_scanner, return; } - ret = read_rules_file(m->ctx, m, include_depth + 1, s.buf); - if (!ret) - log_err(m->ctx, "No components returned from included XKB rules \"%s\"\n", s.buf); + file = fopen(s.buf, "r"); + if (file) { + bool ret = read_rules_file(m->ctx, m, include_depth + 1, file, s.buf); + if (!ret) + log_err(m->ctx, "No components returned from included XKB rules \"%s\"\n", s.buf); + fclose(file); + } else { + log_err(m->ctx, "Failed to open included XKB rules \"%s\"\n", s.buf); + } } static void @@ -1059,18 +1066,14 @@ static bool read_rules_file(struct xkb_context *ctx, struct matcher *matcher, unsigned include_depth, + FILE *file, const char *path) { bool ret = false; - FILE *file; char *string; size_t size; struct scanner scanner; - file = fopen(path, "r"); - if (!file) - goto out; - ret = map_file(file, &string, &size); if (!ret) { log_err(ctx, "Couldn't read rules file \"%s\": %s\n", @@ -1084,8 +1087,6 @@ read_rules_file(struct xkb_context *ctx, unmap_file(string, size); out: - if (file) - fclose(file); return ret; } @@ -1104,12 +1105,9 @@ xkb_components_from_rules(struct xkb_context *ctx, if (!file) goto err_out; - fclose(file); /* FIXME: fix FindFileInXkbPath to not open the file in - the first place */ - matcher = matcher_new(ctx, rmlvo); - ret = read_rules_file(ctx, matcher, 0, path); + ret = read_rules_file(ctx, matcher, 0, file, path); if (!ret || darray_empty(matcher->kccgst[KCCGST_KEYCODES]) || darray_empty(matcher->kccgst[KCCGST_TYPES]) || @@ -1145,6 +1143,8 @@ xkb_components_from_rules(struct xkb_context *ctx, mval->sval.len, mval->sval.start); err_out: + if (file) + fclose(file); matcher_free(matcher); free(path); return ret; |