Change xkb_map_new_from_fd to use FILE*

i.e. xkb_map_new_from_file. The reason is that flex only works with
FILE's, so we must use fdopen on the file descriptor; but to avoid a
memory leak, we must also fclose() it, which, in turn, closes the file
descriptor itself.

Either way is not acceptable, so we can either:
* dup() the fd and use fdopen on that, or
* have the user call fdopen on his own, and accept a FILE* instead of an
  fd.

The second one seems better, and is standard C, so why not. We must add
stdio.h to xkbcommon.h though, which is regrettable, but not a big deal.

Signed-off-by: Ran Benita <ran234@gmail.com>
master
Ran Benita 2012-05-13 23:31:59 +03:00 committed by name
parent d15fa57a4b
commit b89b8e7023
3 changed files with 18 additions and 27 deletions

View File

@ -82,6 +82,7 @@ THE USE OR PERFORMANCE OF THIS SOFTWARE.
#include <stddef.h>
#include <stdint.h>
#include <stdio.h>
#include <xkbcommon/xkbcommon-names.h>
#include <xkbcommon/xkbcommon-keysyms.h>
@ -260,11 +261,11 @@ enum xkb_keymap_format {
/**
* Creates an XKB keymap from a full text XKB keymap passed into the
* file descriptor.
* file.
*/
struct xkb_keymap *
xkb_map_new_from_fd(struct xkb_context *context,
int fd, enum xkb_keymap_format format,
xkb_map_new_from_file(struct xkb_context *context,
FILE *file, enum xkb_keymap_format format,
enum xkb_map_compile_flags flags);
/**

View File

@ -283,36 +283,29 @@ xkb_map_new_from_string(struct xkb_context *ctx,
}
_X_EXPORT struct xkb_keymap *
xkb_map_new_from_fd(struct xkb_context *ctx,
int fd,
xkb_map_new_from_file(struct xkb_context *ctx,
FILE *file,
enum xkb_keymap_format format,
enum xkb_map_compile_flags flags)
{
XkbFile *file;
FILE *fptr;
XkbFile *xkb_file;
if (format != XKB_KEYMAP_FORMAT_TEXT_V1) {
ERROR("unsupported keymap format %d\n", format);
return NULL;
}
if (fd < 0) {
if (!file) {
ERROR("no file specified to generate XKB keymap\n");
return NULL;
}
fptr = fdopen(fd, "r");
if (!fptr) {
ERROR("couldn't associate fd with file pointer\n");
return NULL;
}
if (!XKBParseFile(ctx, fptr, "(unknown file)", &file)) {
if (!XKBParseFile(ctx, file, "(unknown file)", &xkb_file)) {
ERROR("failed to parse input xkb file\n");
return NULL;
}
return compile_keymap(ctx, file);
return compile_keymap(ctx, xkb_file);
}
_X_EXPORT struct xkb_keymap *

View File

@ -25,34 +25,31 @@ authorization from the authors.
*/
#include <assert.h>
#include <unistd.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/stat.h>
#include "xkbcommon/xkbcommon.h"
static int
test_file(const char *path)
{
int fd;
FILE *file;
struct xkb_context *context;
struct xkb_keymap *keymap;
fd = open(path, O_RDONLY);
assert(fd >= 0);
file = fopen(path, "r");
assert(file != NULL);
context = xkb_context_new(0);
assert(context);
fprintf(stderr, "\nCompiling path: %s\n", path);
keymap = xkb_map_new_from_fd(context, fd, XKB_KEYMAP_FORMAT_TEXT_V1, 0);
close(fd);
keymap = xkb_map_new_from_file(context, file,
XKB_KEYMAP_FORMAT_TEXT_V1, 0);
fclose(file);
if (!keymap) {
fprintf(stderr, "Failed to compile keymap\n");