From 0cc5ae33b5319a3ce2759ec9ea65c6c05fda4fb3 Mon Sep 17 00:00:00 2001 From: Ran Benita Date: Fri, 10 Aug 2012 13:30:44 +0300 Subject: [PATCH] Remove xkbcomp/misc.c The KeyName functions are more appropriate in keycodes.c. The ProcessIncludeFile can go to path.c along with the other functions dealing with includes. Signed-off-by: Ran Benita --- Makefile.am | 1 - src/xkbcomp/keycodes.c | 52 ++++++++++++++++ src/xkbcomp/misc.c | 160 ------------------------------------------------- src/xkbcomp/path.c | 80 +++++++++++++++++++++++++ 4 files changed, 132 insertions(+), 161 deletions(-) delete mode 100644 src/xkbcomp/misc.c diff --git a/Makefile.am b/Makefile.am index 1235510..48bccca 100644 --- a/Makefile.am +++ b/Makefile.am @@ -46,7 +46,6 @@ libxkbcommon_la_SOURCES = \ src/xkbcomp/expr.h \ src/xkbcomp/keycodes.c \ src/xkbcomp/keytypes.c \ - src/xkbcomp/misc.c \ src/xkbcomp/parser.y \ src/xkbcomp/parseutils.c \ src/xkbcomp/parseutils.h \ diff --git a/src/xkbcomp/keycodes.c b/src/xkbcomp/keycodes.c index 59cc444..208764a 100644 --- a/src/xkbcomp/keycodes.c +++ b/src/xkbcomp/keycodes.c @@ -1004,3 +1004,55 @@ err_info: ClearKeyNamesInfo(&info); return false; } + +/** + * Find the key with the given name. + * + * @param keymap The keymap to search in. + * @param name The 4-letter name of the key as a long. + * @param use_aliases true if the key aliases should be searched too. + * @param start_from Keycode to start searching from. + * + * @return the key if it is found, NULL otherwise. + */ +struct xkb_key * +FindNamedKey(struct xkb_keymap *keymap, unsigned long name, + bool use_aliases, xkb_keycode_t start_from) +{ + struct xkb_key *key; + + if (start_from < keymap->min_key_code) + start_from = keymap->min_key_code; + else if (start_from > keymap->max_key_code) + return NULL; + + xkb_foreach_key_from(key, keymap, start_from) + if (KeyNameToLong(key->name) == name) + return key; + + if (use_aliases) { + unsigned long new_name; + if (FindKeyNameForAlias(keymap, name, &new_name)) + return FindNamedKey(keymap, new_name, false, 0); + } + + return NULL; +} + +bool +FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname, + unsigned long *real_name) +{ + char name[XkbKeyNameLength]; + struct xkb_key_alias *a; + + LongToKeyName(lname, name); + darray_foreach(a, keymap->key_aliases) { + if (strncmp(name, a->alias, XkbKeyNameLength) == 0) { + *real_name = KeyNameToLong(a->real); + return true; + } + } + + return false; +} diff --git a/src/xkbcomp/misc.c b/src/xkbcomp/misc.c deleted file mode 100644 index 011a2be..0000000 --- a/src/xkbcomp/misc.c +++ /dev/null @@ -1,160 +0,0 @@ -/************************************************************ - * Copyright (c) 1994 by Silicon Graphics Computer Systems, Inc. - * - * Permission to use, copy, modify, and distribute this - * software and its documentation for any purpose and without - * fee is hereby granted, provided that the above copyright - * notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting - * documentation, and that the name of Silicon Graphics not be - * used in advertising or publicity pertaining to distribution - * of the software without specific prior written permission. - * Silicon Graphics makes no representation about the suitability - * of this software for any purpose. It is provided "as is" - * without any express or implied warranty. - * - * SILICON GRAPHICS DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS - * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY - * AND FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT SHALL SILICON - * GRAPHICS BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL - * DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE - * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH - * THE USE OR PERFORMANCE OF THIS SOFTWARE. - * - ********************************************************/ - -#include "xkbcomp-priv.h" -#include "path.h" -#include "parseutils.h" - -/** - * Open the file given in the include statement and parse it's content. - * If the statement defines a specific map to use, this map is returned in - * file_rtrn. Otherwise, the default map is returned. - * - * @param ctx The ctx containing include paths - * @param stmt The include statement, specifying the file name to look for. - * @param file_type Type of file (FILE_TYPE_KEYCODES, etc.) - * @param file_rtrn Returns the key map to be used. - * @param merge_rtrn Always returns stmt->merge. - * - * @return true on success or false otherwise. - */ -bool -ProcessIncludeFile(struct xkb_context *ctx, - IncludeStmt * stmt, - enum xkb_file_type file_type, - XkbFile ** file_rtrn, enum merge_mode *merge_rtrn) -{ - FILE *file; - XkbFile *rtrn, *mapToUse, *next; - - file = XkbFindFileInPath(ctx, stmt->file, file_type, NULL); - if (file == NULL) { - log_err(ctx, "Can't find file \"%s\" for %s include\n", stmt->file, - XkbDirectoryForInclude(file_type)); - return false; - } - - if (!XKBParseFile(ctx, file, stmt->file, &rtrn)) { - log_err(ctx, "Error interpreting include file \"%s\"\n", stmt->file); - fclose(file); - return false; - } - fclose(file); - - mapToUse = rtrn; - if (stmt->map != NULL) { - while (mapToUse) - { - next = (XkbFile *) mapToUse->common.next; - mapToUse->common.next = NULL; - if (streq(mapToUse->name, stmt->map) && - mapToUse->file_type == file_type) { - FreeXKBFile(next); - break; - } - else { - FreeXKBFile(mapToUse); - } - mapToUse = next; - } - if (!mapToUse) { - log_err(ctx, "No %s named \"%s\" in the include file \"%s\"\n", - FileTypeText(file_type), stmt->map, stmt->file); - return false; - } - } - else if (rtrn->common.next) { - log_lvl(ctx, 5, - "No map in include statement, but \"%s\" contains several; " - "Using first defined map, \"%s\"\n", - stmt->file, rtrn->name); - } - if (mapToUse->file_type != file_type) { - log_err(ctx, - "Include file wrong type (expected %s, got %s); " - "Include file \"%s\" ignored\n", - FileTypeText(file_type), FileTypeText(mapToUse->file_type), - stmt->file); - return false; - } - /* FIXME: we have to check recursive includes here (or somewhere) */ - - *file_rtrn = mapToUse; - *merge_rtrn = stmt->merge; - return true; -} - -/** - * Find the key with the given name. - * - * @param keymap The keymap to search in. - * @param name The 4-letter name of the key as a long. - * @param use_aliases true if the key aliases should be searched too. - * @param start_from Keycode to start searching from. - * - * @return the key if it is found, NULL otherwise. - */ -struct xkb_key * -FindNamedKey(struct xkb_keymap *keymap, unsigned long name, - bool use_aliases, xkb_keycode_t start_from) -{ - struct xkb_key *key; - - if (start_from < keymap->min_key_code) - start_from = keymap->min_key_code; - else if (start_from > keymap->max_key_code) - return NULL; - - xkb_foreach_key_from(key, keymap, start_from) - if (KeyNameToLong(key->name) == name) - return key; - - if (use_aliases) { - unsigned long new_name; - if (FindKeyNameForAlias(keymap, name, &new_name)) - return FindNamedKey(keymap, new_name, false, 0); - } - - return NULL; -} - -bool -FindKeyNameForAlias(struct xkb_keymap *keymap, unsigned long lname, - unsigned long *real_name) -{ - char name[XkbKeyNameLength]; - struct xkb_key_alias *a; - - LongToKeyName(lname, name); - darray_foreach(a, keymap->key_aliases) { - if (strncmp(name, a->alias, XkbKeyNameLength) == 0) { - *real_name = KeyNameToLong(a->real); - return true; - } - } - - return false; -} diff --git a/src/xkbcomp/path.c b/src/xkbcomp/path.c index 0ecdd7f..5089f2cf 100644 --- a/src/xkbcomp/path.c +++ b/src/xkbcomp/path.c @@ -28,6 +28,7 @@ #include #include "path.h" +#include "parseutils.h" /** * Extract the first token from an include statement. @@ -199,3 +200,82 @@ XkbFindFileInPath(struct xkb_context *ctx, const char *name, *pathRtrn = strdup(buf); return file; } + +/** + * Open the file given in the include statement and parse it's content. + * If the statement defines a specific map to use, this map is returned in + * file_rtrn. Otherwise, the default map is returned. + * + * @param ctx The ctx containing include paths + * @param stmt The include statement, specifying the file name to look for. + * @param file_type Type of file (FILE_TYPE_KEYCODES, etc.) + * @param file_rtrn Returns the key map to be used. + * @param merge_rtrn Always returns stmt->merge. + * + * @return true on success or false otherwise. + */ +bool +ProcessIncludeFile(struct xkb_context *ctx, + IncludeStmt * stmt, + enum xkb_file_type file_type, + XkbFile ** file_rtrn, enum merge_mode *merge_rtrn) +{ + FILE *file; + XkbFile *rtrn, *mapToUse, *next; + + file = XkbFindFileInPath(ctx, stmt->file, file_type, NULL); + if (file == NULL) { + log_err(ctx, "Can't find file \"%s\" for %s include\n", stmt->file, + XkbDirectoryForInclude(file_type)); + return false; + } + + if (!XKBParseFile(ctx, file, stmt->file, &rtrn)) { + log_err(ctx, "Error interpreting include file \"%s\"\n", stmt->file); + fclose(file); + return false; + } + fclose(file); + + mapToUse = rtrn; + if (stmt->map != NULL) { + while (mapToUse) + { + next = (XkbFile *) mapToUse->common.next; + mapToUse->common.next = NULL; + if (streq(mapToUse->name, stmt->map) && + mapToUse->file_type == file_type) { + FreeXKBFile(next); + break; + } + else { + FreeXKBFile(mapToUse); + } + mapToUse = next; + } + if (!mapToUse) { + log_err(ctx, "No %s named \"%s\" in the include file \"%s\"\n", + FileTypeText(file_type), stmt->map, stmt->file); + return false; + } + } + else if (rtrn->common.next) { + log_lvl(ctx, 5, + "No map in include statement, but \"%s\" contains several; " + "Using first defined map, \"%s\"\n", + stmt->file, rtrn->name); + } + if (mapToUse->file_type != file_type) { + log_err(ctx, + "Include file wrong type (expected %s, got %s); " + "Include file \"%s\" ignored\n", + FileTypeText(file_type), FileTypeText(mapToUse->file_type), + stmt->file); + return false; + } + /* FIXME: we have to check recursive includes here (or somewhere) */ + + *file_rtrn = mapToUse; + *merge_rtrn = stmt->merge; + return true; +} -- 2.7.4