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 <ran234@gmail.com>
master
Ran Benita 2012-08-10 13:30:44 +03:00
parent f7c9d749d3
commit 0cc5ae33b5
4 changed files with 132 additions and 161 deletions

View File

@ -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 \

View File

@ -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;
}

View File

@ -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;
}

View File

@ -28,6 +28,7 @@
#include <limits.h>
#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;
}