X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=src%2Fxkbcomp%2Finclude.c;h=fc692fb13fe4785e423826a4af3857971b336979;hb=a83d745b62ea8ec89e939b00bb3754ad54280942;hp=ac2279f0d20b22af4fc34714dde8312d4962e915;hpb=351b4b9c0bd8844ff9d408be2adee2b4b095fb06;p=platform%2Fupstream%2Flibxkbcommon.git diff --git a/src/xkbcomp/include.c b/src/xkbcomp/include.c index ac2279f..fc692fb 100644 --- a/src/xkbcomp/include.c +++ b/src/xkbcomp/include.c @@ -201,28 +201,49 @@ LogIncludePaths(struct xkb_context *ctx) unsigned int i; if (xkb_context_num_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths searched:\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "%d include paths searched:\n", xkb_context_num_include_paths(ctx)); for (i = 0; i < xkb_context_num_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "\t%s\n", xkb_context_include_path_get(ctx, i)); } else { - log_err(ctx, "There are no include paths to search\n"); + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "There are no include paths to search\n"); } if (xkb_context_num_failed_include_paths(ctx) > 0) { - log_err(ctx, "%d include paths could not be added:\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "%d include paths could not be added:\n", xkb_context_num_failed_include_paths(ctx)); for (i = 0; i < xkb_context_num_failed_include_paths(ctx); i++) - log_err(ctx, "\t%s\n", + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "\t%s\n", xkb_context_failed_include_path_get(ctx, i)); } } +/** + * Return an open file handle to the first file (counting from offset) with the + * given name in the include paths, starting at the offset. + * + * offset must be zero the first time this is called and is set to the index the + * file was found. Call again with offset+1 to keep searching through the + * include paths. + * + * If this function returns NULL, no more files are available. + */ FILE * FindFileInXkbPath(struct xkb_context *ctx, const char *name, - enum xkb_file_type type, char **pathRtrn) + enum xkb_file_type type, char **pathRtrn, + unsigned int *offset) { unsigned int i; FILE *file = NULL; @@ -231,38 +252,39 @@ FindFileInXkbPath(struct xkb_context *ctx, const char *name, typeDir = DirectoryForInclude(type); - for (i = 0; i < xkb_context_num_include_paths(ctx); i++) { + for (i = *offset; i < xkb_context_num_include_paths(ctx); i++) { buf = asprintf_safe("%s/%s/%s", xkb_context_include_path_get(ctx, i), typeDir, name); if (!buf) { - log_err(ctx, "Failed to alloc buffer for (%s/%s/%s)\n", + log_err_with_code(ctx, + XKB_ERROR_ALLOCATION_ERROR, + "Failed to alloc buffer for (%s/%s/%s)\n", xkb_context_include_path_get(ctx, i), typeDir, name); continue; } file = fopen(buf, "rb"); - if (!file) { - free(buf); - buf = NULL; - } else { - break; + if (file) { + if (pathRtrn) { + *pathRtrn = buf; + buf = NULL; + } + *offset = i; + goto out; } } - if (!file) { - log_err(ctx, "Couldn't find file \"%s/%s\" in include paths\n", + /* We only print warnings if we can't find the file on the first lookup */ + if (*offset == 0) { + log_err_with_code(ctx, + XKB_ERROR_INCLUDED_FILE_NOT_FOUND, + "Couldn't find file \"%s/%s\" in include paths\n", typeDir, name); - LogIncludePaths(ctx); - - free(buf); - return NULL; } - if (pathRtrn) - *pathRtrn = buf; - else - free(buf); +out: + free(buf); return file; } @@ -271,32 +293,47 @@ ProcessIncludeFile(struct xkb_context *ctx, IncludeStmt *stmt, enum xkb_file_type file_type) { FILE *file; - XkbFile *xkb_file; + XkbFile *xkb_file = NULL; + unsigned int offset = 0; - file = FindFileInXkbPath(ctx, stmt->file, file_type, NULL); + file = FindFileInXkbPath(ctx, stmt->file, file_type, NULL, &offset); if (!file) return NULL; - xkb_file = XkbParseFile(ctx, file, stmt->file, stmt->map); - fclose(file); + while (file) { + xkb_file = XkbParseFile(ctx, file, stmt->file, stmt->map); + fclose(file); + + if (xkb_file) { + if (xkb_file->file_type != file_type) { + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, + "Include file of wrong type (expected %s, got %s); " + "Include file \"%s\" ignored\n", + xkb_file_type_to_string(file_type), + xkb_file_type_to_string(xkb_file->file_type), stmt->file); + FreeXkbFile(xkb_file); + xkb_file = NULL; + } else { + break; + } + } + + offset++; + file = FindFileInXkbPath(ctx, stmt->file, file_type, NULL, &offset); + } + if (!xkb_file) { if (stmt->map) - log_err(ctx, "Couldn't process include statement for '%s(%s)'\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, + "Couldn't process include statement for '%s(%s)'\n", stmt->file, stmt->map); else - log_err(ctx, "Couldn't process include statement for '%s'\n", + log_err_with_code(ctx, + XKB_ERROR_INVALID_INCLUDED_FILE, + "Couldn't process include statement for '%s'\n", stmt->file); - return NULL; - } - - if (xkb_file->file_type != file_type) { - log_err(ctx, - "Include file of wrong type (expected %s, got %s); " - "Include file \"%s\" ignored\n", - xkb_file_type_to_string(file_type), - xkb_file_type_to_string(xkb_file->file_type), stmt->file); - FreeXkbFile(xkb_file); - return NULL; } /* FIXME: we have to check recursive includes here (or somewhere) */