From 8470f377fc36772d885f4b614f4d42443c4b812b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kristian=20H=C3=B8gsberg?= Date: Tue, 9 Apr 2013 16:54:55 -0400 Subject: [PATCH 02/38] xkb: Add struct XkbCompContext This commit adds a struct that contains most of the context for starting, running and cleaning up after xkbcomp. Reviewed-by: Daniel Stone --- xkb/ddxLoad.c | 76 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 38 insertions(+), 38 deletions(-) diff --git a/xkb/ddxLoad.c b/xkb/ddxLoad.c index d462957..5da3a35 100644 --- a/xkb/ddxLoad.c +++ b/xkb/ddxLoad.c @@ -90,14 +90,21 @@ OutputDirectory(char *outdir, size_t size) } } +typedef struct XkbCompContext { + char keymap[PATH_MAX]; + FILE *out; + char *buf; + char tmpname[PATH_MAX]; + const char *xkmfile; +} XkbCompContextRec, *XkbCompContextPtr; + static Bool XkbDDXCompileKeymapByNames(XkbDescPtr xkb, XkbComponentNamesPtr names, unsigned want, - unsigned need, char *nameRtrn, int nameRtrnLen) + unsigned need, XkbCompContextPtr ctx) { - FILE *out; - char *buf = NULL, keymap[PATH_MAX], xkm_output_dir[PATH_MAX]; + char xkm_output_dir[PATH_MAX]; const char *emptystring = ""; char *xkbbasedirflag = NULL; @@ -105,22 +112,19 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, const char *xkbbindirsep = emptystring; #ifdef WIN32 - /* WIN32 has no popen. The input must be stored in a file which is - used as input for xkbcomp. xkbcomp does not read from stdin. */ - char tmpname[PATH_MAX]; - const char *xkmfile = tmpname; + ctx->xkmfile = ctx->tmpname; #else - const char *xkmfile = "-"; + ctx->xkmfile = "-"; #endif - snprintf(keymap, sizeof(keymap), "server-%s", display); + snprintf(ctx->keymap, sizeof(ctx->keymap), "server-%s", display); OutputDirectory(xkm_output_dir, sizeof(xkm_output_dir)); #ifdef WIN32 - strcpy(tmpname, Win32TempDir()); - strcat(tmpname, "\\xkb_XXXXXX"); - (void) mktemp(tmpname); + strcpy(ctx->tmpname, Win32TempDir()); + strcat(ctx->tmpname, "\\xkb_XXXXXX"); + (void) mktemp(ctx->tmpname); #endif if (XkbBaseDirectory != NULL) { @@ -139,73 +143,69 @@ XkbDDXCompileKeymapByNames(XkbDescPtr xkb, } } - if (asprintf(&buf, + if (asprintf(&ctx->buf, "\"%s%sxkbcomp\" -w %d %s -xkm \"%s\" " "-em1 %s -emp %s -eml %s \"%s%s.xkm\"", xkbbindir, xkbbindirsep, ((xkbDebugFlags < 2) ? 1 : ((xkbDebugFlags > 10) ? 10 : (int) xkbDebugFlags)), - xkbbasedirflag ? xkbbasedirflag : "", xkmfile, + xkbbasedirflag ? xkbbasedirflag : "", ctx->xkmfile, PRE_ERROR_MSG, ERROR_PREFIX, POST_ERROR_MSG1, - xkm_output_dir, keymap) == -1) - buf = NULL; + xkm_output_dir, ctx->keymap) == -1) + ctx->buf = NULL; free(xkbbasedirflag); - if (!buf) { + if (!ctx->buf) { LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp: not enough memory\n"); return FALSE; } #ifndef WIN32 - out = Popen(buf, "w"); + ctx->out = Popen(ctx->buf, "w"); #else - out = fopen(tmpname, "w"); + ctx->out = fopen(ctx->tmpname, "w"); #endif - if (out != NULL) { + if (ctx->out != NULL) { #ifdef DEBUG if (xkbDebugFlags) { ErrorF("[xkb] XkbDDXCompileKeymapByNames compiling keymap:\n"); XkbWriteXKBKeymapForNames(stderr, names, xkb, want, need); } #endif - XkbWriteXKBKeymapForNames(out, names, xkb, want, need); + XkbWriteXKBKeymapForNames(ctx->out, names, xkb, want, need); #ifndef WIN32 - if (Pclose(out) == 0) + if (Pclose(ctx->out) == 0) #else - if (fclose(out) == 0 && System(buf) >= 0) + if (fclose(ctx->out) == 0 && System(ctx->buf) >= 0) #endif { if (xkbDebugFlags) - DebugF("[xkb] xkb executes: %s\n", buf); - if (nameRtrn) { - strlcpy(nameRtrn, keymap, nameRtrnLen); - } - free(buf); + DebugF("[xkb] xkb executes: %s\n", ctx->buf); + free(ctx->buf); #ifdef WIN32 - unlink(tmpname); + unlink(ctx->tmpname); #endif return TRUE; } else - LogMessage(X_ERROR, "Error compiling keymap (%s)\n", keymap); + LogMessage(X_ERROR, "Error compiling keymap (%s)\n", ctx->keymap); #ifdef WIN32 /* remove the temporary file */ - unlink(tmpname); + unlink(ctx->tmpname); #endif } else { #ifndef WIN32 LogMessage(X_ERROR, "XKB: Could not invoke xkbcomp\n"); #else - LogMessage(X_ERROR, "Could not open file %s\n", tmpname); + LogMessage(X_ERROR, "Could not open file %s\n", ctx->tmpname); #endif } - if (nameRtrn) - nameRtrn[0] = '\0'; - free(buf); + ctx->keymap[0] = '\0'; + free(ctx->buf); return FALSE; } @@ -256,6 +256,7 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, FILE *file; char fileName[PATH_MAX]; unsigned missing; + XkbCompContextRec ctx; *xkbRtrn = NULL; if ((keybd == NULL) || (keybd->key == NULL) || @@ -270,12 +271,11 @@ XkbDDXLoadKeymapByNames(DeviceIntPtr keybd, keybd->name ? keybd->name : "(unnamed keyboard)"); return 0; } - else if (!XkbDDXCompileKeymapByNames(xkb, names, want, need, - nameRtrn, nameRtrnLen)) { + else if (!XkbDDXCompileKeymapByNames(xkb, names, want, need, &ctx)) { LogMessage(X_ERROR, "XKB: Couldn't compile keymap\n"); return 0; } - file = XkbDDXOpenConfigFile(nameRtrn, fileName, PATH_MAX); + file = XkbDDXOpenConfigFile(ctx.keymap, fileName, PATH_MAX); if (file == NULL) { LogMessage(X_ERROR, "Couldn't open compiled keymap file %s\n", fileName); -- 1.8.4.2