Blame SOURCES/0002-xkb-Add-struct-XkbCompContext.patch

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