rules: eliminate an extra fopen/fclose cycle

FindXkbFileInPath() opens the file so we're guaranteed that the file not only
exists, but that we can read it. Changing that would alter behavior so instead
let's just pass that file handle along and do the same for include files.

Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
master
Peter Hutterer 2019-11-13 11:38:39 +10:00 committed by Ran Benita
parent ca033a29d2
commit 00f31e0d27
1 changed files with 15 additions and 15 deletions

View File

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