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 <stddef.h>
#include <stdint.h> #include <stdint.h>
#include <stdio.h>
#include <xkbcommon/xkbcommon-names.h> #include <xkbcommon/xkbcommon-names.h>
#include <xkbcommon/xkbcommon-keysyms.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 * Creates an XKB keymap from a full text XKB keymap passed into the
* file descriptor. * file.
*/ */
struct xkb_keymap * struct xkb_keymap *
xkb_map_new_from_fd(struct xkb_context *context, xkb_map_new_from_file(struct xkb_context *context,
int fd, enum xkb_keymap_format format, FILE *file, enum xkb_keymap_format format,
enum xkb_map_compile_flags flags); 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 * _X_EXPORT struct xkb_keymap *
xkb_map_new_from_fd(struct xkb_context *ctx, xkb_map_new_from_file(struct xkb_context *ctx,
int fd, FILE *file,
enum xkb_keymap_format format, enum xkb_keymap_format format,
enum xkb_map_compile_flags flags) enum xkb_map_compile_flags flags)
{ {
XkbFile *file; XkbFile *xkb_file;
FILE *fptr;
if (format != XKB_KEYMAP_FORMAT_TEXT_V1) { if (format != XKB_KEYMAP_FORMAT_TEXT_V1) {
ERROR("unsupported keymap format %d\n", format); ERROR("unsupported keymap format %d\n", format);
return NULL; return NULL;
} }
if (fd < 0) { if (!file) {
ERROR("no file specified to generate XKB keymap\n"); ERROR("no file specified to generate XKB keymap\n");
return NULL; return NULL;
} }
fptr = fdopen(fd, "r"); if (!XKBParseFile(ctx, file, "(unknown file)", &xkb_file)) {
if (!fptr) {
ERROR("couldn't associate fd with file pointer\n");
return NULL;
}
if (!XKBParseFile(ctx, fptr, "(unknown file)", &file)) {
ERROR("failed to parse input xkb file\n"); ERROR("failed to parse input xkb file\n");
return NULL; return NULL;
} }
return compile_keymap(ctx, file); return compile_keymap(ctx, xkb_file);
} }
_X_EXPORT struct xkb_keymap * _X_EXPORT struct xkb_keymap *

View File

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